“魔术”“班级”

时间:2011-03-09 04:42:31

标签: php class

<?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插件的代码 有两个“神奇”的东西,我无法弄清楚为什么:

  1. 上面的类显然没有父母,但是当我var_dump $ this指针时,它被证明是另一个名为GDStarRating的类的实例,而GDStarRating也没有父母!而且,你知道$ this指针不能被反复重新实现。所以我无法理解为什么$ this指针表现得那样。
  2. 函数rewrite_dependencies从另一个名为gdsrAdmFunc的类(gdTemplateDB::rewrite_dependencies而非$instance->rewrite_dependencies调用静态,并且该类也没有任何父级 - 与GdStarRating的孩子关系。但它运作得很好。
  3. 请让我知道,什么可能导致那些“神奇”的东西?

3 个答案:

答案 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从函数bbb调用。

从类bb的对象调用类b

函数b

答案 2 :(得分:1)

是否有一些提取函数调用? $ this指针可以使用此函数反复重新实现:P

extract(array('this' => new stdClass));
var_dump($this); // object(stdClass)[1]