2013-02-25 159 views
2

所以我在面向对象编程的世界新和我目前面临这个问题(一切都在规范中描述):PHP:函数参数必须与动态类名称的对象

<?php 
    class MyClass { 
     // Nothing important here 
    } 

    class MyAnotherClass { 
     protected $className; 

     public function __construct($className){ 
      $this->className = $className; 
     } 
     public function problematicFunction({$this->className} $object){ 
      // So, here I obligatorily want an $object of 
      // dynamic type/class "$this->className" 
      // but it don't works like this... 
     } 
    } 

    $object = new MyClass; 
    $another_object = new MyAnotherClass('MyClass'); 

    $another_object->problematicFunction($object); 
?> 

灿任何人都帮助我?

感谢,马克西姆(法国:对不起,我的英语)

+0

你不能使用{$ this-> className},在有问题的函数中用instanceof检查$ object – sanj 2013-02-25 10:55:22

+0

你想用这个来实现什么?自动加载磁带机? – 2013-02-25 10:57:00

回答

3

你需要的是

public function problematicFunction($object) { 
    if ($object instanceof $this->className) { 
     // Do your stuff 
    } else { 
     throw new InvalidArgumentException("YOur error Message"); 
    } 
} 
0

尝试这样

class MyClass { 
    // Nothing important here 
    public function test(){ 
     echo 'Test MyClass'; 
    } 
} 

class MyAnotherClass { 
    protected $className; 

    public function __construct($className){ 
     $this->className = $className; 
    } 
    public function problematicFunction($object){ 
     if($object instanceof $this->className) 
     { 
      $object->test(); 
     } 
    } 
} 

$object = new MyClass; 
$another_object = new MyAnotherClass('MyClass'); 

$another_object->problematicFunction($object); 
0

这就是所谓的type hinting,你想要做什么只是不支持。

如果所有这些动态类名都有一些共同点(例如,它们对于某些功能而言是不同的实现),您可能需要定义一个基类(也许是抽象类)或一个接口并将该共同祖先用作类型提示:

<?php 

interface iDatabase{ 
    public function __contruct($url, $username, $password); 
    public function execute($sql, $params); 
    public function close(); 
} 

class MyClass implements iDatabase{ 
    public function __contruct($url, $username, $password){ 
    } 

    public function execute($sql, $params){ 
    } 

    public function close(){ 
    } 
} 

class MyAnotherClass { 
    protected $className; 

    public function __construct($className){ 
     $this->className = $className; 
    } 
    public function problematicFunction(iDatabase $object){ 
    } 
} 

否则,刚刚转会支票problematicFunction()身体内,其他的答案解释。

相关问题