【问题标题】:Calling __construct from child class statically(?)从子类静态调用__construct(?)
【发布时间】:2016-04-05 13:50:01
【问题描述】:

我有以下 php 代码:

<?php

class ParentClass {

    public $table_name;

    function __construct() {
        $this->table_name = strtolower(__CLASS__);
    }

}

class ChildClass extends ParentClass {

    function __construct() {
        parent::__construct();
        //And I also want to put here other codes
    }

}

$parent = new ParentClass();
$child = new ChildClass();

echo $parent->table_name . "<br />" . $child->table_name;

?>

结果是

parentclass
parentclass

我希望它是这样的

parentclass
childclass

我如何实现它? 后期静态绑定可以解决我的问题,但是当然不能静态调用。 http://php.net/manual/en/language.oop5.late-static-bindings.php

【问题讨论】:

  • 我能知道你想要达到什么目的吗?
  • 是的,请重新阅读我上面的问题。

标签: php inheritance constructor


【解决方案1】:

这适用于 PHP5.5 及更高版本:

class ParentClass 
{
    public $table_name;

    public function __construct() 
    {
        $this->table_name = strtolower(static::class);
    }
}

class ChildClass extends ParentClass 
{
    public function __construct() 
    {
        parent::__construct();     
        // ...
    }
}

$parent = new ParentClass();
$child = new ChildClass();

echo $parent->table_name . "<br />" . $child->table_name;

有关参考,请参阅http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.class.class

【讨论】:

    【解决方案2】:

    使用static::class 获取使用后期静态绑定的类的名称:

    class ParentClass {
    
        public $table_name;
    
        function __construct() {
            $this->table_name = strtolower(static::class);
        }
    
    }
    

    这将导致所需的

    parentclass
    childclass
    

    【讨论】:

      【解决方案3】:
      <?php
      
      class ParentClass {
      
          public $table_name;
      
      function __construct() {
          $this->table_name = strtolower(__CLASS__);
      }
      
      }
      
      class ChildClass extends ParentClass {
      
      function __construct() {
      
          parent::__construct();
          $this->table_name = strtolower(__CLASS__);
          //And I also want to put here other codes
      }
      
      }
      

      $parent = new ParentClass(); $child = new ChildClass();

      echo $parent->table_name 。 “
      ”。 $child->table_name;

      ?>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-12
        • 1970-01-01
        • 1970-01-01
        • 2015-09-26
        • 1970-01-01
        • 2023-03-15
        相关资源
        最近更新 更多