Php &引用;“魔术”&引用;“类”;

Php &引用;“魔术”&引用;“类”;,php,class,Php,Class,我正在钻研一个名为GD star rating的wordpress插件的代码。 有两件“神奇”的事情我无法解释原因: 上面的类显然没有父类,但当我var_转储$this指针时,它变成了另一个名为gdstarting的类的实例,而gdstarting也没有父类!而且,您知道$this指针不能随意重新实例化。所以我不明白为什么$this指针的行为是这样的 函数rewrite_dependencies是从另一个名为gdsrAdmFunc的类(gdTemplateDB::rewrite_dependen

我正在钻研一个名为GD star rating的wordpress插件的代码。
有两件“神奇”的事情我无法解释原因:

  • 上面的类显然没有父类,但当我var_转储$this指针时,它变成了另一个名为gdstarting的类的实例,而gdstarting也没有父类!而且,您知道$this指针不能随意重新实例化。所以我不明白为什么$this指针的行为是这样的
  • 函数
    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
    class
    b
    调用


    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]