[英]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.