PHP中的类型转换

4

我有一个 PHP 接口

interface IDummy{
public function DoSomething();
}

我有另一个实现此接口的类。

class Dummy implements IDummy{
public function DoSomething(){

}

我该如何在PHP中将Dummy Object强制转换为IDummy,以便我可以调用它?
$dum = new Dummy();
$instance = (IDummy)$dum;
$instance->DoSomething();

我能用PHP实现这个吗?

谢谢和问候 Abishek R Srikaanth

5个回答

4

这里的强制转换是完全不必要的,代码会直接运行。

如果您使用各种类型提示函数检查 Dummy 对象,则其将被视为 IDummy 的实例。

下面的代码可以正常运行,无需进行任何强制转换:

interface I { 
  public function foo(); 
};

class A implements I {
  public function foo() { }
}

function test(I $obj) {
  $obj->foo();
}

$a = new A();
test($a);

请您提供一个例子。每当我尝试上述语法时,总是会出现错误。 - Abishek
1
不要写成 $instance = (IDummy)$dum。修复你的代码,再试一次,如果仍然失败,更新你的帖子,并附上不工作的代码片段。 - Matthew
2
PHP不需要像Java那样冗长,正如您的示例所建议的那样。您不需要进行强制转换,因为PHP已经知道哪些对象是接口的实现者。 - SamT
请参考我的答案以获取示例实现。 - Tomasz Kowalczyk
遗憾的是,尽管函数test被声明为接受接口I的参数,但它并不能阻止函数访问类A中未包含在接口I中的任何其他属性或方法。因此,如果您的意图是限制调用者对对象的操作仅限于接口中包含的内容-很抱歉,这种方法行不通。唯一的方法是将其他成员或函数声明为私有或受保护的。 - Rudiger W.

3
如果类 Dummy 已经实现了接口 IDummy,那么就不需要将 $dum 强制转换为 IDummy - 直接调用方法 DoSomething() 即可。
interface IDummy
    {
    public function doSomething();
    }

class Dummy implements IDummy
    {
    public function doSomething()
        {
        echo 'exists!';
        return;
        }
    }

$dummy = new Dummy();
$dummy->doSomething(); // exists!

我想要做的是以下内容:我有另一个类class DoFinalImplemention{public function Implement($dum){ //这是我想进行类型转换到接口并调用DoSomething方法的地方。我得到的参数是一个IDummy对象。$obj = (IDummy)$dum; $dum->DoSomething(); } }我可以这样做,或者你的实现也能行吗?谢谢和问候 Abishek R Srikaanth - Abishek
你可以直接调用实现IDummy接口的类的对象,而无需将其强制转换为该接口。只需直接调用即可。 - Tomasz Kowalczyk

0
代码应该简单地是这样的:
$class = new ClassName;
$class->yourMethod();

正如@konforce所指出的那样,不需要进行类型转换。您可能想要检查PHP method_exists()函数http://php.net/manual/en/function.method-exists.php。

0

嗯,这可能很有趣,请查看与该问题相关的Java功能。

interface I { 
  public function foo(); 
};

class A implements I {
  public function foo() { echo 'This should be accessible.'; }
  public function baz() { echo 'This should not be available.'; }
}

$dum = new A();
$instance = (I) $dum;
$instance->foo(); // this should work

$instance->baz() // should not work

注意:此代码会抛出错误。似乎您不能像这样转换接口。在Java中是可能的。

0
如果您从配置或其他您不知道的地方知道类名,我认为这应该可以解决问题:
$classname = 'Dummy';
$reflectionClass = new \ReflectionClass($classname);
$instance = $reflectionClass->newInstance();
// $dum = new $className; //you can do this as well I guess
if( $instance instanceof IDummy){
  $instance->DoSomething();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接