правильный способ справиться php 7 типов возврата

<p>я занят созданием приложения и хочу использовать php 7 типов возврата. теперь я прочитал на php.net, что это было дизайнерское решение, что нельзя возвращать <code>null</code>, когда определен тип возврата.</p><p>как правильно это сделать?</p><p>один из вариантов - блок try ... catch:</p><pre><code>public function getmyobject() : myobject { return null; } try { getmyobject(); } catch(exception $e) { //catch the exception } у меня нет хорошего представления об этом, потому что мой код будет огромным блоком try ... catch, поскольку мне нужно написать блок try ... catch для каждого метода, который возвращает объект. <a href="https://en.wikipedia.org/wiki/null_object_pattern">null object pattern является хорошим решением для этого, но мне не нравится идея создать nullobject для каждого объекта в моем приложении. есть ли правильный способ сделать это? 

<blockquote> у меня нет хорошего представления об этом, потому что мой код будет огромным блоком try/catch, так как мне нужно написать блок try/catch для каждого метода, который возвращает объект. </blockquote>альтернативой (с вашим кодом) будет всегда проверять возвращаемое значение для null, чтобы не получать ошибок при использовании null в качестве объекта.использование исключений является более выразительным и делает ошибки видимыми на ранней стадии, что хорошо. поэтому либо убедитесь, что ваш метод всегда возвращает объект, либо сгенерируйте исключение, если он не может выполнить свой контракт. в противном случае тип возвращаемого значения не имеет реального значения.

если ваш код ожидает возврата экземпляра класса, в данном случае myobject, но это не так, то это действительно исключение и должно обрабатываться как таковое.однако вы должны бросить это исключение самостоятельно.public function getmyobject() : myobject { throw new mycustomexception("cannot get my object"); } затем вы можете поймать это конкретное исключение и действовать соответственно.

вы можете использовать option тип данных.этот тип имеет something или nothing в качестве обернутого значения.вы можете найти более подробное описание <a href="https://en.wikipedia.org/wiki/option_type">здесь и одну из открытых реализаций в php <a href="https://github.com/schmittjoh/php-option">здесь ps пожалуйста, не используйте исключения, параметры или дополнительные методы для такой логики, это неправильный инструмент для работы.

в настоящее время это невозможно, хотя, как уже упоминалось, существуют rfc, которые могут решить проблему для будущих версий.на данный момент, ваши варианты:1. удалите тип возврата из сигнатуры вашего метода:public function getmyobject() { return null; } 2. бросьте и поймайте исключение (согласно ответу @ nietthedarkabsol):public function getmyobject() : myobject { throw new mycustomexception("cannot get my object"); } 3. рефакторинг на два метода:private $myobject; //todo think of a better method name public function cangetmyobject() : bool { $this->myobject = new myobject(); return true; } public function getmyobject() : myobject { if(!$this->myobject){ throw new mycustomexception("cannot get my object"); } return $this->myobject; } телефонный код:if($cls->cangetmyobject()){ $myobject = $cls->getmyobject(); } </code></pre><p>4. используйте тип возврата bool и выходной параметр:</p><pre><code>public function trygetmyobject(&$out) : bool { $out = new myobject(); return true; } </code></pre><p>телефонный код:</p><pre><code>$myobject = null; if($cls->trygetmyobject($myobject)){ $myobject->somemethod(); //$myobject is an instance of myobject class } 3-й и 4-й варианты действительно заслуживают рассмотрения только в тех случаях, когда ожидается нулевое возвращение и они часто встречаются, так что накладные расходы на исключения являются фактором .. вероятно, вы обнаружите, что это на самом деле не применяется все, что часто, и исключения являются способом вперед

начиная с php7.1, вы можете использовать типы возвращаемых значений:public function getmyobject(): ?myobject { return null; }  <a href="http://php.net/manual/en/migration71.new-features.php">http://php.net/manual/en/migration71.new-features.php 

я собирался попросить то же самое. я не вижу особого смысла для этого.если у меня есть следующий пример кода, чтобы найти пользователя по имени:<?php class user { protected $name; /** * user constructor. * * @param $name / public function __construct(string $name) { $this->name = $name; } /** * @return mixed */ public function getname() : string { return $this->name; } } function finduserbyname(string $name, array $users) : user { foreach ($users as $user) { if ($user->getname() == $name) { return $user; } } return null; } $users = [ new user('john'), new user('daniel') ]; $user = finduserbyname('john', $users); echo $user->getname()."\n"; $user2 = finduserbyname('micheal', $users); </code></pre><p>я хотел бы сказать php, что я могу получить либо пользователя, либо ноль. теперь мне нужно всегда оборачивать его в блок try try, и я не вижу особого смысла объявлять тип возвращаемого значения в этом случае. с другой стороны, если бы моя функция <code>finduserbyname</code> была сложной, я мог бы случайно вернуть, например, имя пользователя вместо полного объекта пользователя, поэтому я хотел бы определить тип возвращаемого значения.</p><p>я думаю, что более разумным было бы определение нескольких типов возвращаемых значений для функций. иногда вы создаете функцию, которая возвращает один объект или массив объектов, и было бы неплохо определить, эта функция должна возвращать, например, <code>user</code> или массив пользователей: <code>user[]</code>. </p><p>в случае op (а также и моего) мы могли бы объявить тип возвращаемого значения как <code>user, null</code>, и это решило бы проблему.</p>