Аннотации в PHP

BlackSabbath

Новичок
Аннотации в PHP

Здравствуйте,

В языках типа Java 5 и C# существуют так называемые аннотации - средство позволяющее внедрять дополнительную информацию в исходный текст программы, и затем использовать её например для авто-генерации кода.

Я написал пробную версию библиотеки (proof of concept) реализующую поддержку аннотаций в PHP, с использованием PHPDoc. Правда для её работы требуется PHP 5.1.0+

Приведу пример её использования - пусть нам нужно делать однообразную валидацию объектов разных классов. С помощью моей библиотеки это будет выглядеть примерно так для каждого класса:

PHP:
class Person extends AnnotatedClass {

    /**
     * First name
     *
     * @validator.required
     * @validator.maxlength 20
     */
    public $firstName;

    /**
     * Last name
     *
     * @validator.required
     * @validator.maxlength 20
     */
    public $lastName;

    /**
     * Description of the person
     *
     * @validator.maxlength 50
     */
    public $description;

}

Полный пример можно посмотреть здесь: http://bedrin.pochta.ru/phpAnnotations/index_files/Page346.htm

Там же можно скачать саму библиотеку и PHPDoc к ней.

Господа, как Вы считаете, есть ли будующее у этого проекта?
Мне кажеться аннотации могут быть очень полезны при автогенерации кода, написании ORM, MVC фреймворков. Рассчитываю на интересную дискуссию :)
 
Содержание функционала внутри комментариев - страшный бред.

Имхо валидация должна делаться внутри сеттеров.
 
Wicked

В Java мире так не считают. До появления аннотаций в 5 версии, на протяжении нескольких лет мета-информацию хранили именно так.
Правда там она используется во время стройки, а не в runtime.

См: http://xdoclet.sourceforge.net/xdoclet/index.html

Валидацию я упомянул только как пример использования.
Предположим у меня есть CMS в которой есть возможность управлять 20 сущностями - для каждой из них нужно сделать построение объекта по $_GET / $_POST; сделать валидацию.

Мне кажется использование мета-данных может сильно убыстрить процесс разработки, и кроме того уменьшить copy-paste кода и повысить его качество.
 
Вот как можно типы проверить с помощью __get//__set.

PHP:
<?php

define("_NAME", 0);
define("_TYPE", 1);

define("_NUMERIC", 0);
define("_FLOAT", 1);
//Новые типы
define("_PHONE", 2);
define("_STRING20", 3);

//Определяет телефоны вида xxx-xx-xx
function is_phone($str)
{
	if(preg_match("/[0-9]{3}-[0-9]{2}-[0-9]{2}/x", $str))
		return 1;
	return 0;

}

/*Функция которая пропускает строки длинной 20 символов. 
Зачем? Для примера. Но можно понаделать действительно полезных функций*/

function is_string20($str)	
{
	if(strlen($str) == 20)
		return 1;
	return 0;
}

class one
{
	private $check_fn = array			//Функторы
	(
		_NUMERIC => "is_numeric",
		_FLOAT => "is_float",
		_PHONE => "is_phone",
		_STRING20 => "is_string20"
	);
	private $variables;
	function one()
	{
		foreach($s = func_get_args() as $arg)
			$this->variables[$arg[_NAME]] =  array($arg[_TYPE]);
	}
	function __set($nm, $var)
	{
		if(!isset($this->variables[$nm]))
			return $this->error("Error! Variable <b>$nm</b> not found<br />");
		if(!$this->check_fn[$this->variables[$nm][0]]($var))
			return $this->error("Error! Type of <b>$nm</b> mismatch<br />");
		$this->variables[$nm]["value"] = $var;
	}
	function __get($nm)
	{
		if(!isset($this->variables[$nm]))
			return $this->error("Variable $nm not present in this class");
		return $this->variables[$nm]["value"];
	}
	function error($str)
	{
		print $str;
		return 0;
	}
}

$it = new two
(
	array("float_var", _FLOAT),
	array("numeric_var", _NUMERIC),
	array("phone_var", _PHONE),
	array("string20_var", _STRING20)
);

class two extends one
{
	function print_phone()
	{
		print 'Phone: '.$this->phone_var.'<br />';
	}
	function print_float()
	{
		print 'Float: '.$this->float_var.'<br />';
	}
}

$it->float_var = 100.2;
print "\$it->float_var = $it->float_var<br />";

$it->float_var = 1;
print "\$it->float_var = $it->float_var<br />";

$it->numeric_var= "2";
print "\$it->numeric_var = $it->numeric_var<br />";

$it->wrong_var = 222;

$it->numeric_var= "a1";
print "\$it->numeric_var = $it->numeric_var<br />";

$it->phone_var = "2222222";
print "\$it->phone_var = $it->phone_var<br />";

$it->phone_var = "422-22-22";
print "\$it->phone_var = $it->phone_var<br />";

$it->string20_var = "12345";
print "\$it->string20_var = $it->string20_var<br />";

$it->string20_var = "12345123451234512345";
print "\$it->string20_var = $it->string20_var<br />";

print "<br />";
$it->print_phone();
$it->print_float();

$it->s();

?>
 
facelift

Спасибо за ответ. Я понимаю что валидацию можно спроектировать очень большим количеством способов. И даже говоря только о валидации можно поспорить о недостатках предложенного мною метода.

Но давайте не будем концетрироваться на валидации - просто когда я дописал эти классы, мне нужно было сделать пример, и я выбрал валидацию.

Меня интересовали критика и мнения в целом на описанный мною подход.

Господа, кто ещё вставит 5 копеек? Было бы очень интересно выслушать различные мнения.
 
Содержание функционала внутри комментариев - страшный бред.
поддерживаю.

В Java мире так не считают. До появления аннотаций в 5 версии, на протяжении нескольких лет мета-информацию хранили именно так.
java -- не php.
 
master_x

Прошу прощения, но
это как-то некоснтруктивно :) Не вижу почему в Java это активно используют, а в PHP - бред.

Вспомнилась мне сейчас тема про phpAspect:
http://phpclub.ru/talk/showthread.php?s=&threadid=86601&rand=2

По сути ведь тоже самое - только у меня всё происходит в run-time, а в aspect oriented происходит в build-time - на отедльном этапе генерации кода..

Вобщем, чтобы разобраться есть ли надобность, чувствую мне нужно примерчик посерьёзней набросать...
 
BlackSabbath
phpAspect дает возможность делать то, что обычными средствами действительно нельзя сделать (либо будет очень очень очень трудно), выигрывает целесообразность =)
Вобщем, чтобы разобраться есть ли надобность, чувствую мне нужно примерчик посерьёзней набросать...
ждемс, было бы очень хорошо.
 
В общем про aspect oriented буду читать.

Тут и на AgileDev тред интересный попался:
http://forum.agiledev.ru/index.php?t=msg&th=738&start=0&


А про свои аннтоации я впринципе общие настроения понял. Общественность считает что использовать данные описанные в комментариях PHP это зло. Тоже результат.
 
Да нет, на самом деле, все круто. Только уж больно абстрактно. Пока не вырисовалась сфера реального применения технологии..
 
Оригинальное решение, любопытно. Но едва ли универсальное. По мне так BlackSabbath прав, речь о сквозной функциональности и напрашивается АОП. Правда svetasmirnova показала английский вариант статьи, есть русский http://www.citforum.ru/internet/php.shtml
Я пытался там на примерах показать где хорошо бы пришлась дополнительная депомпозиция. Сам в работе чаще всего использую АОП для выделения всей кастомизации конкретного проекта в аспекты (plugins).

А что касается типофикации переменных PHP, я когда то также искал свои решения. Можно посмотреть на http://www.phpclasses.org/browse/package/2652.html

Принцип такой:

Код:
<?PHP
include_once("typification.class.php");

// Example: 
// Options of types specifing are similar Regular Expressions:  
// type_of_value{left_limit,right_limit}[posible_value1|posible_value2]; .. 

class Sample { 
    function Sample() { 
    	// Validate parameters types and values
        new FuncParams("string{0,3}(abc|bbc); integer; array{2}; ArrayOfStrings"); 
        print "PASS"; 
    } 
} 

$r = new Sample('abc', 2, array(1,2), array("123","ABC")); 
?>
 
Altex
Там не описание книги а просто какая-то ода.
Не расскажите свои впечатления?

-~{}~ 19.06.06 23:17:

sheiko

Отлично! Статья оказалсь как раз для меня - что-то об АОП слушывшем но не видевшим. После прочтения в голове родились кое-какие идеи - как реализую так вынесу на общественное порицание.

Кстати - вопросов типификации я не поднимал. Показанный как пример аннотаций валидатор скорее предназначен для проверки пользовательского ввода..
 
Я временно выложил на английском языке книжку
http://altex.f-labs.ru/pp/

В 4-й главе (Chapter 04. Pragmatic Paranoia.doc) с самого начала идёт речь примерно о том, с чего начался топик.

Вообще книжка класса must have.
 
Сверху