Аннотации в 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

Новичок
Содержание функционала внутри комментариев - страшный бред.

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

BlackSabbath

Новичок
Wicked

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

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

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

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

facelift

Новичок
Вот как можно типы проверить с помощью __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();

?>
 

BlackSabbath

Новичок
facelift

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

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

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

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

master_x

Pitavale XXI wieku
Содержание функционала внутри комментариев - страшный бред.
поддерживаю.

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

BlackSabbath

Новичок
master_x

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

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

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

Вобщем, чтобы разобраться есть ли надобность, чувствую мне нужно примерчик посерьёзней набросать...
 

master_x

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

BlackSabbath

Новичок
В общем про aspect oriented буду читать.

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


А про свои аннтоации я впринципе общие настроения понял. Общественность считает что использовать данные описанные в комментариях PHP это зло. Тоже результат.
 

Gorath

Новичок
Да нет, на самом деле, все круто. Только уж больно абстрактно. Пока не вырисовалась сфера реального применения технологии..
 

sheiko

Новичок
Оригинальное решение, любопытно. Но едва ли универсальное. По мне так 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")); 
?>
 

BlackSabbath

Новичок
Altex
Там не описание книги а просто какая-то ода.
Не расскажите свои впечатления?

-~{}~ 19.06.06 23:17:

sheiko

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

Кстати - вопросов типификации я не поднимал. Показанный как пример аннотаций валидатор скорее предназначен для проверки пользовательского ввода..
 

Altex

Новичок
Я временно выложил на английском языке книжку
http://altex.f-labs.ru/pp/

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

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