Черты могут использоваться, чтобы делать то, что вы хотите, но было бы лучше использовать черты для того, что они могут делать: назначать и читать из свойств класса.
В чертах, когда вы назначаете $this->conn
:
$this->conn = ftp_connect($host);
Свойство определено для экземпляров класса, которые используют эту черту.Таким образом, нет необходимости использовать $this->conn = $this->connect()
, поскольку $this->conn
уже будет содержать ресурс подключения.
Поэтому в конструкторе просто вызовите метод connect:
public function __construct()
{
$this->connect($host, $user, $pass);
// $this->conn will now contain the connection made in connect()
}
Нет необходимостиreturn $this->conn;
в черте.Чтобы убедиться, что вы освободили свой ресурс, позвоните по номеру disconnect()
из деструктора FTPManager
:
public function __destruct()
{
$this->disconnect();
}
Как говорится, это довольно странный способ управления этим.Необходимость вручную вызывать connect()
в каждом классе, использующем эту черту, подвержена ошибкам и может привести к проблеме сопровождения (каждый из этих классов должен знать о учетных данных ftp, например, тесно связывая их с конфигурацией).
Если подумать, эти экземпляры классов не зависят от учетных данных ftp, они зависят от активного соединения ftp .Таким образом, гораздо проще запросить соединение ftp в конструкторе класса и не беспокоиться о вызовах connect()
и disconnect()
в каждом классе, который действительно нуждается в соединении ftp.
Мы могли бы подуматькласс-оболочка подключения, который значительно упростил бы ситуацию:
class FTPWrapper {
private $connection;
public function __construct(string $host, string $user, string $pwd)
{
$this->connect($host, $user, $pwd);
}
public function __destruct()
{
$this->disconnect();
}
public function getConnection()
{
return $this->connection;
}
private function connect(string $host, string $user, string $pwd): void
{
$this->connection = ftp_connect($host);
if ($this->connection && ftp_login($this->connection, $user, $pwd)) {
ftp_pasv($this->connection, true);
echo "Connected to: $host !";
}
}
private function disconnect(): void
{
ftp_close($this->conn);
}
}
Затем вставьте эту обертку в любой класс, который ее использует.