isset() 和 __isset() 之间有什么区别?
2022-08-30 09:46:06
我需要了解魔术功能和正常功能。其实php语言构造和php魔术方法的真正区别是什么?当我谷歌搜索它时,他们告诉他们这是一个神奇的功能。php中常见的php函数和魔术函数有什么区别?__isset()
isset()
isset()
__isset()
__isset()
我需要了解魔术功能和正常功能。其实php语言构造和php魔术方法的真正区别是什么?当我谷歌搜索它时,他们告诉他们这是一个神奇的功能。php中常见的php函数和魔术函数有什么区别?__isset()
isset()
isset()
__isset()
__isset()
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是神奇的方法,但你不会调用它。当线路回波$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魔术方法。