Конструктор возвращает объект, а не значение - PullRequest
2 голосов
/ 09 сентября 2011

Почему функция конструкции возвращает объект, а не возвращаемое значение (логическое значение)?

class A{

  function __construct($stuff){

    return ($this->load($stuff) !== false);
  }
}

$aaa = new A($stuff);

if(!$aaa)  die('error'); // never happens


print_r($aaa); // it's a object...

Ответы [ 3 ]

4 голосов
/ 09 сентября 2011

Конструктор: Вы делаете это неправильно.

Конструкторы делают то, что подразумевает их имя: создать новый экземпляр объекта.Таким образом, единственное, что имеет смысл для конструктора - это экземпляр этого объекта.Обратите внимание, что вы почти никогда не увидите конструктор с явным оператором return 1 .

Более чистый способ достичь того, что, как я считаю, вы хотите сделать, - это использовать исключения :

class A {
    function __construct($stuff) {
        if ($this->load($stuff) === false) {
            throw new Exception('Unable to load');
        }
    }
}

try {
    $aaa = new A($stuff);
} catch (Exception $e) {
    die('error' . $e->getMessage());
}

1 Они разрешено, так что для этого может быть веская причина.Просто не могу сейчас об этом думать.

1 голос
/ 09 сентября 2011

Конструктор может возвращать только новый экземпляр объекта. Вы можете попробовать использовать статический вызов функции, который вызовет конструктор и вернет false или новый объект.

0 голосов
/ 09 сентября 2011

Возвращаемое значение конструктора игнорируется оператором new. Оператор new всегда будет возвращать объект. При наличии кода типа

class A {
    function __construct() {
        return 1;
    }
 }
 class B extends A {
     function __construct() {
         var_dump(parent::__construct());
     }
 }
 new B();

вы можете видеть, что конструктор имеет возвращаемое значение. Написание такого кода, конечно, не имеет большого смысла.

Для обработки ошибок внутри конструктора вы должны использовать исключения. Альтернативный подход - это какой-то фабричный метод.

class C {
    private function __construct() { }
    private function init() {
        if (something_goes_wrong()) {
            return false;
        }
     }

     public static createInstance() {
         $retval = new self;
         if (!$retval->init()) {
             return false;
         }
         return $retval;
     }
}
...