如何确保 child 方法实例化 child 而不是 parent object?
How to make sure child method instantiates child instead of parent object?
我有一个 parent 和一个 child class 如下
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
它实例化了一个 Objet
而不是 Produit
,这意味着我无法在实例化的 object 上访问 Produit
的 getter 方法.
知道为什么吗?我是否需要在 Objet 的每个 child class 中重写 findByNumeroDeSerie 方法?
您写道:
return new Objet($row);
所以你有对象。如果您想要 findByNumeroDeSerie
到 return 产品,请使用 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"
更简单,只需使用static
和“late static binding”。
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";
Child
TheParent
我有一个 parent 和一个 child class 如下
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
它实例化了一个 Objet
而不是 Produit
,这意味着我无法在实例化的 object 上访问 Produit
的 getter 方法.
知道为什么吗?我是否需要在 Objet 的每个 child class 中重写 findByNumeroDeSerie 方法?
您写道:
return new Objet($row);
所以你有对象。如果您想要 findByNumeroDeSerie
到 return 产品,请使用 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"
更简单,只需使用static
和“late static binding”。
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";
Child
TheParent