require_once () или die () не работают

== сравнивает ссылки на объекты.

.equals() сравнивает значения String.

Иногда == дает иллюзии сравнения значений String, как в следующих случаях:

String a="Test";
String b="Test";
if(a==b) ===> true

Это связано с тем, что при создании любого строкового литерала JVM сначала ищет этот литерал в пуле строк, и если он найдет совпадение, эта же ссылка будет передана новой String. Из-за этого получаем:

(a == b) ===> true

                       String Pool
     b -----------------> "test" <-----------------a

Однако == не выполняется в следующем случае:

String a="test";
String b=new String("test");
if (a==b) ===> false

В этом случае для new String("test") оператор new String будет создан в куче, и эта ссылка будет указана на b, поэтому b будет дана ссылка на кучу, а не на String pool.

Теперь a указывает на String в пуле String, а b указывает на String в куче. Из-за этого мы получаем:

, если (a == b) ===> false.

                String Pool
     "test" <-------------------- a

                   Heap
     "test" <-------------------- b

Пока .equals() всегда сравнивает значение String, поэтому дает true в обоих случаях:

String a="Test";
String b="Test";
if(a.equals(b)) ===> true

String a="test";
String b=new String("test");
if(a.equals(b)) ===> true

Таким образом, использование .equals() всегда лучше.

13
задан Greg 22 July 2009 в 07:03
поделиться

2 ответа

или имеет более высокий приоритет, чем require / require_once. Поэтому php оценивает

('abc.php') or die("oops")

перед передачей результата в require_once. Или принимает два логических операнда. ('abc.php') оценивается как истина , поэтому все выражение истина и вызывается

require_once true;

. require_once принимает строку, bool (true) -> string => 1 =>

Требуется неудачное открытие ' 1 '
Здесь вам не нужен or die (...). Если файл не может быть прочитан, require_once все равно остановит экземпляр php.
30
ответ дан 1 December 2019 в 17:40
поделиться

Поскольку include - это специальная языковая конструкция, а не функция, для нее не требуется парантерес для списка параметров:

Поскольку include () - это специальная языковая конструкция, круглые скобки вокруг ее аргумента не нужны. Будьте осторожны при сравнении возвращаемого значения.

На самом деле он имеет только один параметр, и его заключение в дополнительные скобки ничего не меняет:

1 ≡ (1) ≡ ((1)) ≡ (((1)) ) ≡…

Итак, ваш оператор идентичен этому (парметр просто обернут):

require_once (('abc.php') or die("oops"));

Итак, у нас есть логическое выражение в качестве параметра, которое либо true , либо false . И эти значения имеют строковый эквивалент "1" и "" соответственно:

var_dump((string) true === "1");
var_dump((string) false === "");

Это причина, по которой получается это Требуется ошибка открытия '1' сообщение об ошибке.

Но использование круглых скобок в нужном месте, как здесь, заставляет его работать так, как вы этого хотите:

(@include_once 'abc.php') or die("oops");

Здесь 'abc.php' явно является параметром, а дизъюнкция с die («ой») выполняется для возвращаемого значения include_once . Оператор @ просто игнорирует сообщение об ошибке, которое includesd_once выдает, если файл не существует.

PS: print также является специальная языковая конструкция и работает таким же образом.

) выполняется для возвращаемого значения include_once . Оператор @ просто игнорирует сообщение об ошибке, которое includesd_once выдает, если файл не существует.

PS: print также является специальная языковая конструкция и работает таким же образом.

) выполняется для возвращаемого значения include_once . Оператор @ просто игнорирует сообщение об ошибке, которое includesd_once выдает, если файл не существует.

PS: print также является специальная языковая конструкция и работает таким же образом.

13
ответ дан 1 December 2019 в 17:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: