==
сравнивает ссылки на объекты.
.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()
всегда лучше.
или имеет более высокий приоритет, чем 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.
Поскольку 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
также является специальная языковая конструкция и работает таким же образом.