如何确保子方法实例化子对象而不是父对象?

我有一个父类和一个子类如下


class Objet {


    ../..


    static function findByNumeroDeSerie($table, $numeroDeSerie) {

        $db = new Db();

        $query = $db->prepare("SELECT * from $table WHERE numeroDeSerie = :numeroDeSerie");

        $query->bindValue(':numeroDeSerie', $numeroDeSerie, PDO::PARAM_INT);

        $query->execute(); 

        while($row = $query->fetch()) {

            return new Objet($row);

        }

    }

}



class Produit extends Objet {

    // 

}

当我调用方法时Produit::findByNumeroDeSerie($table, $numeroDeSerie),


$produit = Produit::findByNumeroDeSerie("produits", $_GET['numeroDeSerie']);

echo get_class($produit); // echoes Object

它实例化了 anObjet而不是 a Produit,这意味着我无法访问Produit实例化对象上的 getter 方法。


知道为什么吗?我是否需要在 Objet 的每个子类中重写findByNumeroDeSerie方法?


白板的微信
浏览 115回答 2
2回答

汪汪一只猫

更简单,只需使用static和“后期静态绑定”。class TheParent {    public static function build(): TheParent    {        return new static();    }}class Child extends TheParent {}$child = Child::build();$parent = TheParent::build();echo get_class($child), "\n"; //echo get_class($parent), "\n";输出:孩子家长

炎炎设计

你写了:return new Objet($row);所以你有对象。如果你想像这样findByNumeroDeSerie返回产品使用功能:get_called_class()<?phpclass A {&nbsp; &nbsp; static public function foo() {&nbsp; &nbsp; &nbsp; &nbsp; $className = get_called_class();&nbsp; &nbsp; &nbsp; &nbsp; return new $className();&nbsp; &nbsp; }}class B extends A {}var_dump(get_class(B::foo())); // string(1) "B"
打开App,查看更多内容
随时随地看视频慕课网APP