gpt4 book ai didi

带有静态函数的 PHP 动态类名

转载 作者:搜寻专家 更新时间:2023-10-31 21:29:07 27 4
gpt4 key购买 nike

我发现了一些奇怪的 PHP 行为,如果有人可以向我解释为什么这段代码的某些部分有效而其他部分无效,我很感兴趣。

当类名存储在变量中时,PHP 可以动态创建新类。它工作正常,因为我使用的是现代版本的 PHP (5.5.28)。但是我发现了一些我不太理解的奇怪行为。

当类名存储在某个对象的属性中时会出现问题。在这种情况下,不能在动态类上调用静态函数:$this->dynClass::SomeFunction() 失败,($this->dynClass)::SomeFunction() 也失败。但是 $instance = new $this->dynClass 有效。因此,如果我需要在 $this->dynClass 上调用静态方法,我必须创建一个本地变量来存储相同的字符串:$tmp = $this->dynClass .然后,我可以调用 $tmp::SomeFunction()

我真的不明白。这可能是一个错误吗?请有人解释一下。

这是我的示例代码:

<?php
class MyClass {
static function SomeFunction($name){
echo "Hello $name\n";
}
}

MyClass::SomeFunction("World"); //Works fine as it should, prints Hello World

$firstInstance = new MyClass;
$firstInstance::SomeFunction("First"); //prints hello first, no problem

//here comes the interesting part

$dynClass = "MyClass";

$dynClass::SomeFunction("Dynamic"); //Yeah, it works as well

$secondInstance = new $dynClass;
$secondInstance::SomeFunction("Second"); //Hello Second. Fine.

//And here comes the part that I don't understand

class OtherClass {
private $dynClass = "MyClass";

public function test(){

$thirdInstance = new $this->dynClass; //WORKS!
$thirdInstance::SomeFunction('Third'); //Hello Third

//BUT

$this->dynClass::SomeFunction("This"); //PHP Parse error: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM)

//OK, but then this one should work:

($this->dynClass)::SomeFunction("This"); //same error. WHY??

//The only solution is creating a local variable:
$tmp = $this->dynClass;
$tmp::SomeFunction("Local"); //Hello Local

}
}

$otherInstance = new OtherClass;
$otherInstance->test();

?>

最佳答案

Uniform Variable Syntax 之前, php 的变量解析基本上是一大堆极端情况。

特别是某些操作,如 ::,在 (...) 表达式上不受支持。

您遇到的两个错误是这种松散定义且不一致的变量解析器的示例。

关于带有静态函数的 PHP 动态类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32120309/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com