PHP версия класса атрибутов свойств ASP.NET/C# - PullRequest
5 голосов
/ 22 декабря 2009

Есть ли такая вещь?

Я бы хотел сделать что-то подобное в 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 ]

8 голосов
/ 22 декабря 2009

PHP не имеет встроенного механизма для объявления атрибутов, но возможно моделировать это поведение, используя некоторый пользовательский код. Основная идея состоит в том, чтобы поместить ваши метаданные в блок комментариев, а затем написать класс, который анализирует этот блок комментариев. Это менее удобно, чем в C #, потому что вам нужно убедиться, что ваши атрибуты комментариев отформатированы правильно, но это работает.

Вот пример того, как это сделать: http://web.archive.org/web/20130302084638/http://interfacelab.com/metadataattributes-in-php/

2 голосов
/ 27 мая 2013

Принятый ответ от Энди Уилсона ссылается на страницы, которые больше не доступны. Мне удалось попасть на саму страницу через http://web.archive.org/web/20130116184636/http://interfacelab.com/metadataattributes-in-php/, но загрузка кода, на которую ссылается автор, также является неработающей ссылкой.

Однако с тех пор я нашел отличную реализацию аннотаций PHP здесь: https://github.com/mindplay-dk/php-annotations

Единственный недостаток, который я обнаружил до сих пор, заключается в том, что ваши имена файлов и классов одинаковы, и тот же случай , что с Code Igniter - нет, но однажды я Я решил, что скоро все заработает, и, конечно, это ограничение не повлияет на все реализации.

1 голос
/ 22 декабря 2009

Нет, по крайней мере, изначально не поддерживается PHP.

Вы можете использовать структуру, которая обеспечит проверку форм, например. Zend Framework имеет класс Zend_Form , который позволяет указывать, требуются ли поля, какого типа они должны быть, и отображать сообщение об ошибке, если это не так.

0 голосов
/ 27 января 2019

Как уже упоминалось в других ответах, с PHP ниже 5.0 это было невозможно, однако, начиная с PHP 5.0 , можно имитировать функциональность 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 и т.п. удалит комментарии из вашего кода, и они будут недоступны, поэтому вам нужно будет настроить свою платформу, чтобы оставлять комментарии в покое.

0 голосов
/ 22 декабря 2009

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;
        }
    }
}
0 голосов
/ 22 декабря 2009

Я думаю, что некоторые фреймворки могут предоставлять такую ​​функциональность, но PHP не предназначен для обеспечения таких высокоуровневых конструкций.

0 голосов
/ 22 декабря 2009

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