gpt4 book ai didi

php - php中的类替换

转载 作者:可可西里 更新时间:2023-11-01 12:33:37 28 4
gpt4 key购买 nike

有什么办法可以让它发挥作用吗?看例子:

class car {
function __construct($type){
switch ($type) {
case 'big' : return new big_car();
case 'small' : return new small_car();
}
}
function whatisit () {
echo "this is car ;( \n";
}
}

class big_car extends car {
function __construct(){}
function whatisit () {
echo "this is big car ;) \n";
}
}

class small_car extends car {
function __construct(){}
function whatisit () {
echo "this is small car ;) \n";
}
}

所以目标是这样使用它:

$mycar = new car('big');
$mycar->whatisit(); // i want it to say that it's big

我猜想这是一种糟糕的方式,它不能以这种方式工作,但也许有诀窍?

PS::我知道我可以为此使用特殊的静态方法,但是...

最佳答案

您需要一家汽车工厂来制造新车;这不是 JavaScript :)

class car_factory 
{
function create_car($type = null)
{
switch ($type) {
case 'big':
return new big_car();

case 'small':
return new small_car();

case null:
return new car();
}
throw new InvalidArgumentException($type);
}
}

$factory = new car_factory;
$small_car = $factory->create_car('small');
$std_car = $factory->create_car();

当然,您应该从原始代码中删除 __construct 函数。

作为mentioned在评论中,您可以通过使用动态类来完全概括这一点,假设类扩展具有相同的构造函数并且类命名是一致的:

class car_factory
{
function create_car($type = null)
{
if (is_null($type)) {
return new car();
}

$class = "{$type}_car";
if (class_exists($class)) {
$obj = new $class();

if ($obj instanceof car) {
return $obj;
}
}

throw new InvalidArgumentException($type);
}
}

我个人对这两种方式都没有偏好;如果可扩展性是一个关键因素,那就去做吧,否则坚持使用简单的 switch

关于php - php中的类替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16676544/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com