Можете ли вы вернуть ложь от конструктора?
<?php class ftp_stfp{ //private vars of the class private $host; private $username; private $password; private $connection_type; private $connection = false; function __contruct( $host, $username, $password, $connection_type ){ //setting the classes vars $this->host = $host; $this->username = $username; $this->password = $password; $this->connection_type = $connection_type; //now set the connection into this classes connection $this->connection = $this->connect(); //check the connection was set else return false if($this->connection === false){ return false; } } ... etc etc the rest of the class
Вызовите класс:
$ftp_sftp = new ftp_sftp( $host, $uname, $pword, $connection_type );
Действительно ли это правильно, т. Е. Будет ли $ ftp_sftp var быть ложным или удерживать класс в зависимости от результата метода __construct, или это полностью неправильная логика?
Нет. Конструкторы не имеют возвращаемых значений. Если вам требуется получить какой-то результат от конструктора, вы можете сделать несколько вещей:
Если вам нужно вернуть значение, используйте метод для тяжелого подъема (обычно называемый init()
).
public static function init( $host, $username, $password, $connection_type ){ //setting the classes vars $this->host = $host; $this->username = $username; $this->password = $password; $this->connection_type = $connection_type; //now set the connection into this classes connection $this->connection = $this->connect(); //check the connection was set else return false if($this->connection === false){ return false; } } $ftp_sftp = ftp_sftp::init();
Сохраните результаты в переменной-члене и проверьте ее значение после вызова конструктора.
function __construct( $host, $username, $password, $connection_type ){ //setting the classes vars $this->host = $host; $this->username = $username; $this->password = $password; $this->connection_type = $connection_type; //now set the connection into this classes connection $this->connection = $this->connect(); } $ftp_sftp = new ftp_sftp( $host, $uname, $pword, $connection_type ); if ($ftp_sftp->connection !== false) { // do something }
Вы можете использовать метод connect()
для исключения. Это немедленно прекратит выполнение и перейдет в ваш блок catch
:
private method conntect() { // connection failed throw new Exception('connection failed!'); } try { $ftp_sftp = new ftp_sftp( $host, $uname, $pword, $connection_type ); } catch (Exception $e) { // do something }
Конструкторы не могут возвращать значения. Вы можете сделать исключение в этой должности:
if($this->connection === false){ throw new Exception('Connection can not be established.'); }
Затем вы можете создать экземпляр переменной в блоке try-catch.
try { $ftp_sftp = new ftp_sftp( $host, $uname, $pword, $connection_type ); } catch(Exception $e) { //Do whatever you want. }
Я думаю, вы можете создать объект снаружи и напрямую использовать свой метод connect () и протестировать там
$ftp_sftp = new ftp_sftp( $host, $uname, $pword, $connection_type ); $ftp_sftp->connect();
если соединение открыто.
Есть интересный вопрос о том, почему конструкторы не имеют возвращаемых значений. Почему конструкторы не возвращают значения? ,
Кроме того, кажется, что, возвращая «False», вы хотите отрицать создание объекта. Если это так, я бы предположил, что вы исключили исключение, если соединение завершилось неудачей, и таким образом создание объекта завершится неудачно.