2013-02-25 109 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()身體內,其他的答案解釋。

相關問題