从子类静态调用__construct(?)


Calling __construct from child class statically(?)

我有以下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

这适用于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.

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

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

这将产生所需的

parentclass
childclass
<?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;

?>