我可能在这里遗漏了一些明显的东西,因为这是其他OOP语言的基本功能,但我正在努力用PHP这样做。我知道PHP不是“真正的”OOP语言,但仍然......
我所追求的是将实例化为派生类的对象转换为基类。有点像:
class Some{}
class SomeMock extends Some {}
function GetSomeMock(){
$mock = new SomeMock();
return (Some)$mock; //Syntax error here
}
我发现了一些奇怪的请求,要求将基类的对象向下转换为派生,这可能会带来一些令人讨厌的调整,但这个基本功能并不一定非常困难。我在这里缺少什么?
编辑:似乎我要努力实现的目标始终如一。没问题。 GetSomeMock()是一个工厂方法,它将返回一个模拟对象存根(从基类派生,在构造函数中预先填充的所有属性)和预期的属性值。然后我会将它与从数据库中恢复的另一个基类型对象进行比较:
$this->assertEquals($mockObject, $realObject);
由于$ mockObject和$ realObject属于不同类型,因此立即失败。我可以想象我可以实现相同的许多变通方法,但我希望尽可能简单。
答案 0 :(得分:5)
好的,简短的回答似乎是:这是不可能的。 PHP比我更了解我需要什么类型。
答案 1 :(得分:4)
在PHP中你不能转换为特定的类,我甚至看不到任何需要。
您可以转换为某种原生类型 - string
,int
,array
,object
。但不是特定的课程。
如果您需要使用基类的某些功能,可以通过parent
关键字进行操作。
class Some {
public function execute(){
echo "I am some" ;
}
}
class SomeMock extends Some {
public function execute(){ //Override the function
parent::execute() ; //Here you can execute parent's functionality and add some more
}
}
修改:
instanceof
运营商可能派上用场。比较对象时。
例如:
$object = new SomeMock() ;
$status = ($object instanceof Some && $object instanceof SomeMock); //will return true here ;
子类继承非私有属性和方法。
让我们说,你有你的功能:
function assertEquals($mockObject, $realObject){
if ($mockObject instanceof Some && $realObject instanceof Some){
//Both objects have the same base class - Some
//That means they must have inherited the functionality and properties of Some class.
}
}
答案 2 :(得分:0)
您可以使用自定义功能执行此操作:
private function castParameter(BaseClass $parameters) : DerivedClass {
return $parameters;
}
答案 3 :(得分:0)
当我需要将派生类强制转换为基类时,我确实遇到过用例。我做了以下。
function castToParentClass($derivedClassInstance) {
$parentClassName = get_parent_class($derivedClassInstance);
$parentClassInstance = new $parentClassName();
foreach ($parentClassInstance as $key => $value) {
$parentClassInstance->{$key} = $derivedClassInstance->{$key};
}
return $parentClassInstance;
}