Другим вариантом является использование негативного взгляда:
:%s/\v^((here)@!.)* here//
\v
используется для очень волшебства , чтобы избежать побега в регулярном выражении.
Все эти предлагаемые решения усложняют Ваш код для изгиба PHP для выполнения некоторой синтаксической точности. Желание, чтобы PHP был чем-то, что это не (как польза), является путем к безумию.
Я просто использовал бы:
$u = new User();
$s = $u->login()->get_db_data()->get_session_data();
Это ясно, относительно кратко и не включает черной магии, которая может представить ошибки.
И конечно, Вы могли всегда перемещаться в Ruby или Python. Это изменит Вашу жизнь.
<?php
class User
{
function __construct()
{
}
function Login()
{
return $this;
}
function GetDbData()
{
return $this;
}
function GetSession()
{
return array("hello" => "world");
}
}
function Create($name)
{
return new $name();
}
$s = Create("User")->Login()->GetDbData()->GetSession();
var_dump($s);
?>
Это - возможное решение :) Конечно, необходимо выбрать лучшее название функции...
Или если Вы не возражаете против немного служебного:
<?php
class User
{
function __construct($test)
{
echo $test;
}
...
}
function CreateArgs($name)
{
$ref = new ReflectionClass($name);
return $ref->newInstanceArgs(array_slice(func_get_args(), 1));
}
$s = CreateArgs("User", "hi")->Login()->GetDbData()->GetSession();
var_dump($s);
?>
Единственным путем можно добраться, что-то подобное с одноэлементным статическим методом или фабрикой. Например:
class User
{
//...
/**
*
* @return User
*/
public static function instance()
{
$args = func_get_args();
$class = new ReflectionClass(__CLASS__);
return $class->newInstanceArgs($args);
}
//...
}
Это использует API Reflection PHP5 для создания нового экземпляра (использующий любой args, отправленный в:: экземпляр ()) и возвраты это разрешающий Вам сделать объединение в цепочку:
$s = User::instance()->login()->get_db_data()->get_session_data();
По тому, как код достаточно гибок, что единственной вещью, которую необходимо будет изменить при копировании того статического метода, является @return комментария PHPDoc.
Если Вы хотите преждевременно оптимизировать свой код как наш друг Nelson, можно заменить содержание Пользователя:: экземпляр () с:
return new self();
Нет причин объединять хак (для обхода синтаксической проблемы) и сам код создания объекта.
Поскольку новое-выражение не может использоваться в качестве левого члена оператора объекта, а выражение вызова функции можно, вам нужно только заключить ваш объект в вызов функции, которая возвращает свой собственный аргумент:
function hack($obj) { return $obj; }
$mail = hack(new Zend_Mail())
-> setBodyText('This is the text of the mail.')
-> setFrom('somebody@example.com', 'Some Sender')
-> addTo('somebody_else@example.com', 'Some Recipient')
-> setSubject('TestSubject');