PHP & namespace

igortik

Новичок
Вопрос в надобности пространств имен на ПХП.

Учитывая, что множество лоадеров делается по принципу разбора имени класса на составляющие путей по префиксу "_", то стоит ли смотреть в сторону пространств имен с пхп 5.3 > ?
 

A1x

Новичок
наконец то автолоадеры можно делать без разбора по "_" и вообще обходиться без этих длиннющих имен классов с "_"
 

tz-lom

Продвинутый новичок
Вопрос в надобности пространств имен на ПХП.

Учитывая, что множество лоадеров делается по принципу разбора имени класса на составляющие путей по префиксу "_", то стоит ли смотреть в сторону пространств имен с пхп 5.3 > ?
стоит ,т.к. Old_Zend_Ugly_Style это и был костыль из за нехватки неймспейсов
так же пространства имён могут в себе заключать функции , что так же весьма удобно
 

Lirik

Новичок
A1x
Можно придумать что-то поинтересней чем зендовский autoload через "_"
 

igortik

Новичок
Не совсем согласен, что неймспейс введеный решает проблему "_", ведь в случае с неймспейсами мы работаем не с "_" а с "\" :)

И автолоадер все равно необходим, т.к. нам надо инклудить файл.
зы. а как на счет создания совместимого zend style и неймспейс-стайл ? :)

ну а на счет удобства - согласен, учитывая, что можно это все дело использовать совместно с "use" и добиться красоты, но, боюсь что эти алиасы могут сбить с толку, когда их много и в разных местах кода ...
 

Lirik

Новичок
A1x
в Yii есть classMap например, удобная вещь, и имена классов не страдают от этого
PHP:
	private static $_coreClasses=array(
		'CApplication' => '/base/CApplication.php',
		'CApplicationComponent' => '/base/CApplicationComponent.php',
		'CBehavior' => '/base/CBehavior.php',
		'CComponent' => '/base/CComponent.php',
		'CErrorEvent' => '/base/CErrorEvent.php',
		'CErrorHandler' => '/base/CErrorHandler.php',
//etc
	);

	public static function autoload($className)
	{
		// use include so that the error PHP file may appear
		if(isset(self::$_coreClasses[$className]))
			include(YII_PATH.self::$_coreClasses[$className]);
		else if(isset(self::$classMap[$className]))
			include(self::$classMap[$className]);
		else
		{
			if(strpos($className,'\\')===false)
				include($className.'.php');
			else  // class name with namespace in PHP 5.3
			{
				$namespace=str_replace('\\','.',ltrim($className,'\\'));
				if(($path=self::getPathOfAlias($namespace))!==false)
					include($path.'.php');
				else
					return false;
			}
			return class_exists($className,false) || interface_exists($className,false);
		}
		return true;
	}
 

Вурдалак

Продвинутый новичок
Хм, вопрос о надобности namespace вы решаете по тому как будет организован autoload? Да autoload вообще ничем не отличается.
 

igortik

Новичок
Вурдалак
нет конечно, я пытаюсь провести для себя аналогию с тем, что было До NS :)
И пока ничего выгодного не вижу, увы.

Ну сократили мы имя класса, в то же время полный NS написан выше на пару строк. Далее идет use, который надо где-то документировать или загонять в массив, что тоже не совсем удобно.
Если применять стиль ZF, то там все ясно из имени класса, разработчику достаточно посмотреть на имя и он понимает где Это лежит и Что делает.
По NS ясно тоже самое! Только можно еще функции вызывать, но в контексте ООП не хотелось бы это рассматривать :/

Объясните, пожалуйста, что еще полезного?
 

tz-lom

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

A1x

Новичок
а почему в use нельзя использовать * как в Java или Action Script?

типа use myspace\smth\*;
 

tz-lom

Продвинутый новичок
потому что
syntax error, unexpected '*', expecting T_STRING
на самом деле можно через use импортировать всё пространство имён под нужным именем, что весьма близко к use ns\*;
PHP:
namespace A {
   class one { }
}

namespace B {
  use A as V;
  class two extends V\one { }
}

namespace {
$a = new B\two;
}
 

A1x

Новичок
понятно что syntax error, но почему сделали именно так а не как яве?
просто интересно, в принципе алиасы тоже нормально но * выглядит более интуитивно понятно

наверное потому что в пхп с глобальным пространством имен не все так просто
 

tz-lom

Продвинутый новичок
скорее потому что в яве нет автолоада и там всегда понятно во что * разрешится при сборке
 
Сверху