<?php class gdTemplateDB {
[...]
function rewrite_dependencies($section, $id) {
global $wpdb, $table_prefix;
/*var_dump($this);
die;*/
**include($this->plugin_path.'code/t2/templates.php');**
[...]
}
?>
我正在挖掘一个名为GD星级的wordpress插件的代码 有两个“神奇”的东西,我无法弄清楚为什么:
rewrite_dependencies
从另一个名为gdsrAdmFunc的类(gdTemplateDB::rewrite_dependencies
而非$instance->rewrite_dependencies
调用静态,并且该类也没有任何父级 - 与GdStarRating的孩子关系。但它运作得很好。请让我知道,什么可能导致那些“神奇”的东西?
答案 0 :(得分:2)
出于向后兼容性原因,PHP允许您将非静态方法称为静态方法。以这种方式调用非静态方法时,它会不取消设置$this
。相反,来自另一个实例的值会渗透到新方法中。
您可以使用以下代码复制此内容:
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();
打印哪些:
In C: true
In B: true
In A: true
但是,如果您将静态方法标记为这样,则PHP行为正常并且未定义$this
。在此示例中,如果您将A::foo()
声明为static function foo()
,将B::bar()
声明为static function bar()
,则会看到以下内容:
In C: true
Notice: Undefined variable: this in test.php on line 13
In B: false
Notice: Undefined variable: this in test.php on line 6
In A: false
答案 1 :(得分:1)
class a{
function aa(){
var_dump($this);
}
}
class b{
function bb(){
a::aa();
}
}
$ob = new b();
$ob->bb();
此处a::aa()
输出
object(b)#1 (0) { // $this is instance of b
}
这里$ a在类a中是b类的对象,因为,
类aa
的函数a
从函数bb
类b
调用。
bb
的对象调用类b
的函数b
。
答案 2 :(得分:1)
是否有一些提取函数调用? $ this指针可以使用此函数反复重新实现:P
extract(array('this' => new stdClass));
var_dump($this); // object(stdClass)[1]