2013-03-16 298 views
2

我一直在使用活動記錄,並且我想稍微改變景色,一些開發人員朋友建議查看ORM,我所看到的所有ORM項目都需要一個單獨的類來擴展ORM類。動態創建類

我的問題是:有什麼辦法可以動態創建一個功能使用PHP的類沒有eval

這是我有:

<?php 
    class Constructor 
    { 
      function new_class($class) 
      { 
        $myself = get_called_class(); 
        eval("class {$class} extends {$myself} { }"); 
      } 
      function say_hi() 
      { 
        $class = get_called_class(); 
        echo "Hi, {$class}!"; 
      } 
    } 

    $constructor = new Constructor; 
    $constructor->new_class("Greeter"); 

    $greeter = new Greeter; 

    $greeter->say_hi(); // Hi, Greeter! 

但是,我的客戶告訴我,eval被阻止在他的環境,由於他是在共享主機。

+0

但是爲什麼?創建一個類,把參數放在數組中,添加一個方法'__set'和'__get' - 在數組中設置參數,你可以添加參數'$ name',它將設置'setName($ name)'和它將是類的名字,試圖獲得,做'getName()。班上的繼承人。 – mkjasinski 2013-03-16 13:28:00

+0

在PHP中沒有「美麗」的方式來做到這一點。你可以使用eval(),或者在運行時用類定義創建一個文件,然後包含()它......但考慮改變你的程序設計。 見http://stackoverflow.com/questions/3490474/how-to-create-or-define-class-in-php-at-runtime – 2013-03-16 13:46:19

回答

2

你可能不想這樣做。但是作爲一種解決方法,您可以使用與通過eval()相同的方法,但是一旦您構建了要提供給eval的字符串,您只需將其作爲文件寫出並再次包含它。

事情是這樣的:

function my_eval($str) 
{ 
    $filename = uniqid().'.tmp'; 
    file_put_contents ($filename, $str); 
    include $filename; 
    unlink ($filename); 
} 

我從內存中寫入這一點,並沒有測試過,但我認爲它應該做的伎倆。我現在看到的唯一的警告是,你仍然基本上和eval()一樣,並且這種變體不允許你創建與調用上下文相同範圍內的變量(儘管你可以使用$ GLOBALS []以解決全局範圍變量)。