2009-12-22 98 views
3

有沒有這樣的事情?PHP版ASP.NET/C#屬性屬性類

我想要做這樣的事情在PHP,但我看不出如何從PHP文檔做到這一點:

public class User : ValidationBase 
{ 
    [NotNullOrEmpty(Message = "Please enter a user name.")] 
    public string UserName { get; set; } 
} 

我正在尋找的是PHP相當於一個ASP的.NET/C#屬性,在上面的示例中,屬性聲明上方的[NotNullOrEmpty(Message = "Please enter a user name.")]行代表了該屬性。

回答

7

PHP沒有用於聲明屬性的內置機制,但可以使用一些自定義代碼來模擬此行爲。基本的想法是將你的元數據放在註釋塊中,然後編寫一個解析該註釋塊的類。這比C#不太方便,因爲您需要確保您的評論「屬性」格式正確,但是它可以正常工作。

這裏是如何做到這一點的例子:http://web.archive.org/web/20130302084638/http://interfacelab.com/metadataattributes-in-php/

+0

這看起來像是最接近我所尋找的。非常感謝,安迪。請提供 – Stepppo

+1

更新鏈接。 – BILL

1

不,沒有,至少沒有本地支持的PHP。

例如,您可以使用將提供表單驗證的框架。 Zend Framework有一個Zend_Form類,它允許指定是否需要字段,它們應該是什麼類型,以及如果不是這種情況,則顯示錯誤消息。

0

在PHP中沒有這樣的事情,你實際上必須編寫它。

像這樣的一點,我想:

public function setUserName($str) { 
    if (empty($str)) { 
     throw new Exception('Please enter a user name.'); 
    } 
    $this->userName = $str; 
} 

public function getUserName($str) { 
    return $this->userName; 
} 
0

我覺得有些框架可以把這種功能,但PHP沒有被設計來提供這種高層次的結構。

0

PHP不具有的屬性,也沒有財產屬性。

如果你想在php中做類似的事情,你必須聲明一個私有字段,並編寫公共的getter和setter方法,並在setter方法中做一些空的檢查。

class User extends ValidationBase 
{ 
    private $userName; 
    public function GetUserName() 
    { 
     return $this->userName; 
    } 
    public function SetUserName($val = '') 
    { 
     if ($val === '') 
     { 
      return false; 
     } 
     else 
     { 
      $this->userName = $val; 
      return true; 
     } 
    } 
} 
2

從Andy Wilson接受的答案鏈接到不再可用的頁面。我設法通過http://web.archive.org/web/20130116184636/http://interfacelab.com/metadataattributes-in-php/到達頁面本身,但作者所指的代碼下載也是死鏈接。

但是我既然發現了一個偉大的實施PHP批註的位置:https://github.com/mindplay-dk/php-annotations

我到目前爲止發現的唯一的缺點是依賴於你的文件名和類名相同且的同樣的情況與Code Igniter他們不是,但一旦我工作了,我很快就已經工作了,當然這個限制不會影響所有的實現。