繁体   English   中英

PHP版的ASP.NET / C#属性属性类

[英]PHP version of ASP.NET/C# property attribute class

有这样的事吗?

我想在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.")]行表示。

PHP没有用于声明属性的内置机制,但可以使用一些自定义代码来模拟此行为。 基本思想是将元数据放在注释块中,然后编写一个解析该注释块的类。 这不如C#方便,因为您需要确保您的注释“属性”格式正确,但它可以正常工作。

以下是如何执行此操作的示例: http//web.archive.org/web/20130302084638/http : //interfacelab.com/metadataattributes-in-php/

Andy Wilson接受的答案链接到不再可用的页面。 我设法通过http://web.archive.org/web/20130116184636/http://interfacelab.com/metadataattributes-in-php/访问该页面,但作者所指的代码下载也是一个死链接。

但是我已经在这里找到了一个很好的PHP注释实现: https//github.com/mindplay-dk/php-annotations

到目前为止,我发现的唯一缺点是依赖于你的文件名和类名是相同的,并且与Code Igniter 相同的情况它们不是,但是一旦我解决了这个问题,我很快就完成了所有工作当然,这种限制不会影响所有实现。

不,没有,至少没有PHP原生支持。

例如,您可以使用将为表单提供验证的框架。 Zend Framework有一个Zend_Form类,允许指定是否需要字段,它们应该是什么类型,以及如果不是这样,则显示错误消息。

在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;
}

我认为一些框架可以带来这种功能,但PHP不是为提供这样的高级构造而设计的。

php没有属性或属性属性。

如果你想在php中做类似的事情,你必须声明一个私有字段,并编写公共getter和setter方法,并在setter方法中进行某种null检查。

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;
        }
    }
}

正如其他答案所提到的,PHP低于5.0是不可能的,但是从PHP 5.0开始,可以使用DocComment来模仿C#功能DocComment

我从这个问题中提出了这个想法,并为了这个问题而对其进行了修改。 可以使用JSON字符串作为DocComment ,以便以后更容易解析并使用代码中的反射访问它们,如下所示

<?php
/** {"Description":"This is a test class"} */
class User {

   /** {"Message":"Please enter a user name."} */
   public $Username;

   /** {"Message":"Please enter a user name."} */
   public function Login($username) {
        print "Inside `aMemberFunc()`";
    }
}

$rc = new ReflectionClass("User");  // class name
print $rc->getDocComment()                          . "<br />\n"; // Get Class comment
print $rc->getMethod("Login")->getDocComment()      . "<br />\n"; // Get Method comment
print $rc->getProperty("Username")->getDocComment() . "<br />\n"; // Get Property comment

?>

有以下结果

/** {"Description":"This is a test class"} */
/** {"Message":"Please enter a user name."} */
/** {"Message":"Please enter a user name."} */

从这里继续前进应该很简单,删除DocComment标记并将其解析为JSON以使对象具有您的属性。 有更多可用的reflection方法,例如获取属性列表,方法和常量,您可以在PHP反射手册中阅读它们

注意:使用Zend等进行编译将删除代码中的注释,但它们将无法使用,因此您需要配置平台以留下评论。

我在反思中使用了doc评论。 查看更多信息ReflectionClass :: getDocComment

这是我项目中的示例代码

/**
* You can use doc comments in reflection. 
* See more info https://php.net/manual/en/reflectionclass.getdoccomment.php
* 
* @role("admin")
*/
class permissiontest extends Page
{
    public function render($p)
    {
        echo 'Howdy friend!';
        //$this->renderView($p);
    }
}

反射

class handler 
{
    public function OnPageRendering($page)
    {
        $r = new ReflectionClass(get_class($page));
        $s = $r->getDocComment();
        if (!str::isNullOrEmpty(trim($s))) {
            // tags::pre($s);
            /**
             * @role("filter")
             */
            $matches = array();
            //@role("filter") https://regex101.com/
            preg_match('/@role\(\"(.*)\"\)/', $s, $matches);
            if (!arrays::isNullOrEmpty($matches)) {
            // tags::pre($matches);//Array ( [0] => @role("filter") [1] => filter ) 
            // tags::pre($matches[0]);//@role("filter")        
            // tags::pre($matches[1]);//filter
                $filter = $matches[1];
                //tags::h("Check Permission for:".$filter);
                if (!userHasRights($filter)) {
                    die('You do not have permission on this page! Process stopped!');
                }
            }

        }


    }
}
function userHasRights($right) {
    return false;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM