2009-12-22 70 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他们不是,但一旦我工作了,我很快就已经工作了,当然这个限制不会影响所有的实现。