В чем разница между isset() и isset()?
мне нужно знать о магической функции __isset()
и нормальная функция isset()
. Собственно в чем реальная разница между PHP языковая конструкция isset()
и php magic method __isset()
? Когда я гуглил это они сказали, что __isset()
- Это волшебная функция. В чем разница между обычными функциями php и магическими функциями в php?
7 ответов:
isset()
это конструкция языка, которая проверяет инициализацию переменных или свойств класса:
$a = 10; isset($a); // true isset($a, $b); // false class Test { public $prop = 10; } $obj = new Test; isset($obj->prop); // true
__isset()
это магический метод, который вызывается, когда
isset()
илиempty()
проверьте несуществующее или недоступное свойство класса:class Test { public function __isset($name) { echo "Non-existent property '$name'"; } } $obj = new Test; isset($obj->prop); // prints "Non-existent property 'prop'" and return false
отличия:
isset() __isset()
Language construct | Magic method | Always return bool | Result depends on custom logic* | Must be invoked in code | Called automatically by event | Unlimited number of parameters | Has only one parameter | Can be used in any scope | Must be defined as method** | Is a reserved keyword | Not a reserved keyword | Can't be redefined (Parse error) | Can be redefined in extended class***
__isset()
результат в любом случае будет автоматически кастед какbool
.на самом деле вы можете определить пользовательскую функцию
__isset()
но это не имеет ничего общего с магическими методами.посмотреть .
Магические Методы
в отличие от обычных функций может быть определен только в области класса и вызывается автоматически на определенных событиях, таких как: недоступный вызов метода, сериализация класса, когда
unset()
используется для недоступных свойств и так далее. См. Также эту официальную документацию:перегрузка.
_ _ isset-это магический метод. Магические методы-это методы, называемые внутренне.
рассмотрим следующий код
<?php // Declare a simple class class TestClass { public $foo; public function __construct($foo) { $this->foo = $foo; } public function __toString() { return $this->foo; } } $class = new TestClass('Hello'); echo $class; ?>
здесь _toString-это магический метод, но вы не будете его вызывать. Когда выполняется строка echo $class;. PHP знает, что теперь я должен рассматривать объект $class как строку и рассматривать любой объект как строковый вызов_tostring метод, если он реализован в этом классе.
все магические методы называются так в косвенных путь.
еще один пример как следовать
<?php class CallableClass { public function __invoke($x) { var_dump($x); } } $obj = new CallableClass; $obj(5); var_dump(is_callable($obj)); ?>
аналогично, в приведенном выше коде, var_dump (is_callable ($obj)); вызывает __invoke magic метод косвенно.
прежде всего позвольте мне рассказать вам, что делает функция isset (). Функция isset () проверяет, установлено ли значение или оно равно null. The _функция isset () - это магический метод в PHP. Любая функция с " _ " в начале-это магический метод в PHP. Теперь __isset() вызывается путем вызова isset() или empty () для недоступных свойств, под которыми я подразумеваю те свойства, которые не были определены в классе и явно определяются во время выполнения. Вот такой кусочек код, который должен заставить вас понять это лучше:
<?php class PropertyTest { /** Location for overloaded data. */ private $data = array(); /** Overloading not used on declared properties. */ public $declared = 1; /** Overloading only used on this when accessed outside the class. */ private $hidden = 2; public function __set($name, $value) { echo "Setting '$name' to '$value'\n"; $this->data[$name] = $value; } public function __get($name) { echo "Getting '$name'\n"; if (array_key_exists($name, $this->data)) { return $this->data[$name]; } $trace = debug_backtrace(); trigger_error( 'Undefined property via __get(): ' . $name . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'], E_USER_NOTICE); return null; } /** As of PHP 5.1.0 */ public function __isset($name) { echo "Is '$name' set?\n"; return isset($this->data[$name]); } /** As of PHP 5.1.0 */ public function __unset($name) { echo "Unsetting '$name'\n"; unset($this->data[$name]); } /** Not a magic method, just here for example. */ public function getHidden() { return $this->hidden; } } echo "<pre>\n"; $obj = new PropertyTest; $obj->a = 1; echo $obj->a . "\n\n"; var_dump(isset($obj->a)); unset($obj->a); var_dump(isset($obj->a)); echo "\n"; echo $obj->declared . "\n\n"; echo "Let's experiment with the private property named 'hidden':\n"; echo "Privates are visible inside the class, so __get() not used...\n"; echo $obj->getHidden() . "\n"; echo "Privates not visible outside of class, so __get() is used...\n"; echo $obj->hidden . "\n"; ?>
простыми словами, __isset () помогает isset () работать над защищенными/частными vars в классе .
пример:
class test { public $x = array(); }
в вышеуказанном классе вы можете сделать это
isset($test->x['key'])
как$x
общественнаяа вот
class test { protected $x = array(); function __isset($key) { return isset($this->x[$key]); } }
$x
защищен, и вы не можете получить к нему доступ, поэтому мы создали__isset()
чтобы помочь нам использоватьisset($x['key'])
можно и так сказать
__isset()
- это просто мост дляisset()
магические функции автоматически вызываются (срабатывают), когда что-то происходит. Обычные функции должны быть специально вызваны вашим php-кодом.
в вашем случае: __isset () будет автоматически вызываться, когда у вас есть isset (), который пытается получить недоступное свойство.
пример:
root@folgore:/tmp/php# cat a.php <?php class a { private $att1; public $att2; function __isset($field) { echo "__isset invoked for $field\n"; } } $obj=new a(); // __isset will be triggered: isset($obj->att1); // __isset will not be triggered: isset($obj->att2); root@folgore:/tmp/php# php a.php __isset invoked for att1
в чем разница между обычными функциями php и магическими функциями в php?
общие функции PHP объявлены и доступны с ожидаемыми входными данными и результатами, но они должны быть вызваны. Напротив, магические функции определены в PHP, но когда они определены в классе, они будут вызываться автоматически. Например,
isset()
это функции PHPопределить, если переменная установлена и не является NULL
но _ _ isset () - это собственность перегрузки класса.
перегрузка в PHP предоставляет средства для динамического "создания" свойств и методов. Эти динамические сущности обрабатываются с помощью магических методов, которые можно установить в классе для различных типов действий. Методы перегрузки вызываются при взаимодействии со свойствами или методами, которые не были объявлены или не видны в текущем состоянии масштаб.
он будет вызван магически за сценой, как описано выше, если объявлен в классе. Давайте поэкспериментируем с перегрузкой свойств PHP класса.
<?php class PropertyTest { /** Location for overloaded data. */ private $data = array(); /** Overloading not used on declared properties. */ public $declared = 1; /** Overloading only used on this when accessed outside the class. */ private $hidden = 2; public function __set($name, $value) { echo "Setting '$name' to '$value'\n"; $this->data[$name] = $value; } public function __get($name) { echo "Getting '$name'\n"; if (array_key_exists($name, $this->data)) { return $this->data[$name]; } $trace = debug_backtrace(); trigger_error( 'Undefined property via __get(): ' . $name . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'], E_USER_NOTICE); return null; } /* As of PHP 5.1.0 */ public function __isset($name) { echo "Is '$name' set?\n"; return isset($this->data[$name]); } /** As of PHP 5.1.0 */ public function __unset($name) { echo "Unsetting '$name'\n"; unset($this->data[$name]); } /** Not a magic method, just here for example. */ public function getHidden() { return $this->hidden; } } echo "<pre>\n"; $obj = new PropertyTest; //__set() is called when 'a' property is not visible outside of class $obj->a = 1; //__get() is called when 'a' property is not visible outside of class echo "a: ".$obj->a . "\n\n"; //__isset() is called when 'a' property is not visible outside of class var_dump(isset($obj->a)); unset($obj->a); //__isset() is called when 'a' property is not visible outside of class var_dump(isset($obj->a)); echo "\n"; //__isset() is not called as 'declared' property is visible outside of class var_dump(isset($obj->declared)); //__get() is not called as 'declared' property is visible outside of class echo "declared: ". $obj->declared . "\n\n"; //__set() is not called as 'declared' property is visible outside of class $obj->declared = 3; //__get() is not called as 'declared' property is visible outside of class echo "declared: ". $obj->declared . "\n\n"; //__isset() is called as 'hidden' property is not visible outside of class var_dump(isset($obj->hidden)); echo "Let's experiment with the private property named 'hidden':\n"; echo "Privates are visible inside the class, so __get() not used...\n"; echo $obj->getHidden() . "\n"; echo "Privates not visible outside of class, so __get() is used...\n"; var_dump($obj->hidden); ?>
приведенный выше код выведет
Setting 'a' to '1' Getting 'a' a: 1 Is 'a' set? bool(true) Unsetting 'a' Is 'a' set? bool(false) bool(true) declared: 1 declared: 3 Is 'hidden' set? bool(false) Let's experiment with the private property named 'hidden': Privates are visible inside the class, so __get() not used... 2 Privates not visible outside of class, so __get() is used... Getting 'hidden' NULL
он говорит, что свойство 'hidden' не установлено и показывает
bool(false)
но эхо из значения ' 2 'позже, потому что "скрытое" свойство не видно за пределами класса, и он вызывает__isset()
волшебная функция, но она также не установлена в "данных", поэтому она возвращаетbool(false)
. ВgetHidden()
функция, хотя она возвращает частное свойство объекта "скрытый", которое видно для внутренних функций объекта. В последнемvar_dump($obj->hidden)
он называет__get()
метод и он возвращает NULL. Потому что в__get()
метод он ищетdata['hidden']
что этоNULL
.Примечание: пример здесь от PHP Manuel: перегрузка С некоторыми изменениями.
надеюсь, что это помогает!