Php &引用;“魔术”&引用;“类”;
我正在钻研一个名为GD star rating的wordpress插件的代码。Php &引用;“魔术”&引用;“类”;,php,class,Php,Class,我正在钻研一个名为GD star rating的wordpress插件的代码。 有两件“神奇”的事情我无法解释原因: 上面的类显然没有父类,但当我var_转储$this指针时,它变成了另一个名为gdstarting的类的实例,而gdstarting也没有父类!而且,您知道$this指针不能随意重新实例化。所以我不明白为什么$this指针的行为是这样的 函数rewrite_dependencies是从另一个名为gdsrAdmFunc的类(gdTemplateDB::rewrite_dependen
有两件“神奇”的事情我无法解释原因:
rewrite_dependencies
是从另一个名为gdsrAdmFunc的类(gdTemplateDB::rewrite_dependencies
,而不是$instance->rewrite_dependencies
)静态调用的,该类也与gdsrAdmFunc没有任何父子关系。但它工作得很好请让我知道,什么可能导致这些“神奇”的事情?出于向后兼容性的原因,PHP允许您将非静态方法作为静态方法调用。以这种方式调用非静态方法时,它不取消设置
$this
。相反,来自另一个实例的值会渗透到新方法中
您可以使用以下代码复制此项:
<?php class gdTemplateDB {
[...]
function rewrite_dependencies($section, $id) {
global $wpdb, $table_prefix;
/*var_dump($this);
die;*/
**include($this->plugin_path.'code/t2/templates.php');**
[...]
}
?>
其中打印:
class A {
function foo() {
global $c;
echo "In A: " . ($this === $c ? 'true' : 'false') . "\n";
}
}
class B {
function bar() {
global $c;
echo "In B: " . ($this === $c ? 'true' : 'false') . "\n";
A::foo();
}
}
class C {
function baz() {
global $c;
echo "In C: " . ($this === $c ? 'true' : 'false') . "\n";
B::bar();
}
}
$c = new C();
$c->baz();
但是,如果将静态方法标记为静态方法,则PHP将正常运行,并且未定义$this
。在本例中,如果将A::foo()
声明为static function foo()
,将B::bar()
声明为static function bar()
,则会看到以下内容:
In C: true
In B: true
In A: true
此处a::aa()
输出
class a{
function aa(){
var_dump($this);
}
}
class b{
function bb(){
a::aa();
}
}
$ob = new b();
$ob->bb();
这里,类a中的$this是类b的对象,因为
类a
的函数aa
从函数bb
classb
调用
类
b
的函数bb
是从类b
的对象调用的,是否有一些提取函数调用?
$this pointer可以使用以下函数随意重新初始化::P
object(b)#1 (0) { // $this is instance of b
}
回答一半的问题,我如何给一半的分数也许我不够清楚,但这解释了这两个问题。$this指针不会神奇地从类继承。你只是看到另一个类的$this指针流入了另一个函数。非常感谢,我想知道为什么那个伟大插件的开发人员使用这种愚蠢的编码方式:|我看不到任何摘录,但无论如何,谢谢你,这些信息对我很有帮助:D
object(b)#1 (0) { // $this is instance of b
}
extract(array('this' => new stdClass));
var_dump($this); // object(stdClass)[1]