为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
白板的微信 2023-03-26 14:06:47
我有一个父类和一个子类如下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方法?
查看完整描述

2 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

更简单,只需使用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";

输出:

孩子

家长


查看完整回答
反对 回复 2023-03-26
?
炎炎设计

TA贡献1808条经验 获得超4个赞

你写了:


return new Objet($row);

所以你有对象。如果你想像这样findByNumeroDeSerie返回产品使用功能:get_called_class()


<?php


class A {

    static public function foo() {

        $className = get_called_class();

        return new $className();

    }

}


class B extends A {


}


var_dump(get_class(B::foo())); // string(1) "B"


查看完整回答
反对 回复 2023-03-26
  • 2 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信