2014-01-29 75 views
-3

在PHP有時這將是很好,如果我可以定義一個函數或類似

$myfunctionname="test"; 

function $myfunctionname(){ 
    //... 
} 

與變量名稱的類,所以它會創建函數test()

或帶班太例如:

$foo = bar; 
class $foo { 
    // lots of complicated stuff 
    // ... 
} 

但這沒有工作。 像這樣會給解析錯誤!

有沒有解決方案?

(我知道,這不是很好的做法,但只是作爲一種解決方法,那將是很方便)


編輯:我實際的問題:
我有一個框架遷移過程,其中每個遷移步驟都在一個單獨的php包含文件夾中。 每個文件只包含一個包含包含文件名稱的遷移類。 由於該類必須具有該特定名稱,因此我想創建該類的名稱到由文件名常量創建的通用名稱__FILE__

+5

即使這是可能的,如果您真的這樣做了...... WAT。 –

+0

http://www.php.net/manual/en/language.namespaces.dynamic.php – ToBe

+1

@ToBe,我想他想要一個變量類名稱,而不是使用變量調用一個類 – Prisoner

回答

0

否。此代碼在第3行上拋出一個分析錯誤,因爲在$

$foo = 'bar'; 

class $foo { 
    function hello() { 
     echo "World"; 
    } 
} 

$mybar = new bar(); 
$mybar->hello(); 

結果:

Parse error: syntax error, unexpected T_VARIABLE, expecting T_STRING on line 3

正如揚德沃夏克在評論中指出:即使你想出一個辦法做到這一點,不這樣做

+0

這不工作...但有沒有辦法? –

+0

這個臭味「va可變變量「,這應該像瘟疫一樣避免。 –

+0

@JanDvorak這是OP問的問題;我不知道任何其他方式可以做一個可變的類名。 –

1

是的,你可以,但我不想讓你。

$classname = "test"; 

eval("class {$classname}{ public function hello(){ echo \"hello!\"; } }"); 

$evil_class = new $classname(); 
$evil_class->hello(); // echo's "hello!" 

現在,如果你不介意我我要去洗個澡。

+3

哦,上帝。你必須向他展示「eval」,好像他所做的事情已經不夠糟糕了) – crush

+1

@crush哈哈哈,我知道。我只是不認爲PHP已經夠糟糕了。 – Prisoner

+0

+1使其工作; -1使用'eval()'。 OP將創建一個應用程序的飛行意大利麪怪物。 –

1

您可以使用一個工廠模式:

class poly_Factory { 
    public function __construct() { 
     $class = 'poly'; 
     return new $class(); 
    } 
} 

如果這是你想要得到任何東西。

http://net.tutsplus.com/tutorials/php/understanding-and-applying-polymorphism-in-php/ 向下滾動到第4步,最後一部分...

我知道你沒有要求這個,但你的問題是很好的還有什麼?

+0

模式實際上是唯一合理的方法。同時檢查裝飾和/或策略。 – ToBe

+1

我不認爲你應該在構造函數中這樣做! – ToBe

+0

@ToBe唔,是的,你在那一個上得到了我......我用SOLID和狗屎很好地準備了,但我仍然想知道如何在調用類時防止做意大利麪代碼程序混亂,所以我想到了一個過程,一個自動調用下一個節點的類的「網絡」。我甚至想要顯示他給'$ class'傳遞'$ class'的變量,其中'$ bar = new poly_Factory('poly');'。想聊聊這個。實際聊天? – loveNoHate

0

如果你想創建一個值對象,你可以使用stdClass內建類型。

$object = new stdClass; 
$object->someValue = "Hello World"; 
echo $object->someValue; 

See it in Action

如果你想分配方法,那麼你必須使用魔法__call功能,這裏是我會怎麼做。

class AnonObject{ 
    private $properties = array(); 
    private $methods = array(); 

    public function __get($property){ 
     return array_key_exists($property, $this->properties)?$this->properties[$property]:null; 
    } 

    public function __set($property, $value){ 
     if (!is_string($value) && is_callable($value)){ 
      if ($value instanceof \Closure){ 
       // bind the closure to this object's instance and static context 
       $this->methods[$property] = $value->bindTo($this,get_class($this)); 
      } else { 
       // invokable objects 
       $this->methods[$property] = $value; 
      }    
     } else { 
      $this->properties[$property] = $value; 
     } 
    } 

    public function __call($method, $args){ 
     if (array_key_exists($method, $this->methods)){ 
      call_user_func_array($this->methods[$method], $args); 
     } else { 
      throw new RuntimeException("Method ".$method." does not exist on object"); 
     } 
    } 
} 

See it In Action

注意,如其他幾個人說這是不好的做法。如果本練習的目標是在運行時組成一個對象實例的行爲,那麼更可維護的解決方案是使用Strategy Pattern

相關問題