2012-06-13 63 views
0

我使用codeigniter和控制器文件夾中,我創建了一個php文件,如:
注意:自動連接數據庫。

<?php 

    class Book extends CI_Controller { 

     $query = $this->db->get('books'); 

     foreach ($query->result() as $row) { 

      function $row->book_name() { 
       echo $row->book_name; 
      } 

     } 

    } 

?> 

我試圖從數據庫中獲取書的名稱創建功能,但我不能。通過在函數名稱中使用$變量,是否可以創建函數?如果沒有,如何快速創建它?謝謝...

+2

一個人不直接開始直接在類的下面編寫邏輯。你的邏輯**有**進入一個函數。 –

+0

對於想知道這個問題的人來說:如果數據庫包含書籍'foo','bar'和'baz',OP想要生成名爲'foo','bar'和'baz'的成員函數,其中返回的東西。 – Eric

回答

0

是你正在尋找的create_function()

但嚴重的是,它花了我一分鐘,谷歌它..

+1

PHP現在支持正確的匿名函數,甚至關閉。 – ddlshack

4

絕對。

$myfunction = function($a,$b,$c) {return $a+$b+$c;}; 

這是一個匿名函數的一個例子。它沒有名字,但可以通過$myfunction(1,2,3)訪問。

我不完全確定你想要在你的例子中做什麼......只有echo $row->book_name就夠了嗎?或者你是否想要定義一個與書名同名的函數?在後一種情況下,您可以使用變量變量:${$row->book_name} = function... - 但這可能不是一個好主意。

+2

附註:在PHP 5.3中添加了像這樣定義的函數。如果您仍然在使用舊版本,請改用['create_function()'](http://php.net/create-function)。 –

4

我想你可能會對__call()感興趣。

如果對不存在的類中的方法進行調用,將調用__call()方法,您可以從那裏處理該調用。

當您閱讀結果時,將書籍存儲在數組中,併爲您的課程添加__call方法。訪問該方法時,您可以根據所調用函數的名稱在數組中搜索該書,並採取適當的行動。

class Book extends CI_Controller { 
    protected $_books = array(); 

    public function __construct() { 
     $query = $this->db->get('books'); 

     foreach ($query->result() as $row) { 
      $this->_books[] = $row->book_name; 
     } 
    } 

    public function __call($name, $arguments) { 
     if (in_array($name, $this->_books)) { 
      echo $name; 
     } else { 
      ehco 'I do not have this book!'; 
     } 
    } 
} 

記只要保持PHP的規則命名方法,有效的函數名以字母或下劃線,其次是任意數量的字母,數字或下劃線。請不要在空格處留下空白。

+0

這是問題真正要求的唯一答案。 – Eric

相關問題