让我们从第一原则重建它
- 您可以使用
{value}
来放置动态方法/属性名称
即如果您有
class Dog {
public string $name = 'doggy';
public function walk() {
}
}
你可以做
$dog = new Dog();
$dog->walk();
$dog->{'walk'}(); // equivalent
echo $dog->name;
echo $dog->{'name'};
as 你可以做 this and 'walk'
and name are value, they can also come from variables
$attribute = 'name';
$dog->{$attribute};
- PHP有一些神奇的方法来处理未定义的方法/属性,完整列表有https://www.php.net/manual/en/language.oop5.overloading.php个
例如,每当您调用名称未定义的静态方法时,都会调用__callStatic()
这样
class Html
{
static public function __callStatic($name, $arguments)
{
// Note: value of $name is case sensitive.
echo "Calling object method '$name' "
. implode(', ', $arguments). "\n";
}
};
Html::iDontExist();
将输出Calling object method 'iDontExist'
- 现在如果我们混合1和2,我们就可以做到
Html::{"Hello world"};
它将输出Calling object method 'Hello World'
个
结论
- 使用
{}
个语法,您可以拥有不遵循正常惯例的方法(即它们可以具有空间、表情符号、特殊字符等)
- 使用像
__callStatic
这样的重载神奇方法,您可以拥有以前不存在的方法
因此,通过组合1和2,您的库允许一个方法本身已经是一个参数,并且处理这个名称的所有逻辑都将在__callSatic
中
因此,如果某个东西是已定义的静态方法,则与执行Html::something('div.my-class#my-id', 'This is element content' )
相同