Почему я не могу вернуть дескриптор напрямую из конструктора, когда он кажется очень похожим на непосредственный вызов метода класса?
Если бы вы смогли это сделать, вы бы не смоглине имеет экземпляра HMMDatabaseHandle
;у вас будет экземпляр PDO
. Как бы вы получили доступ к любым другим методам, которые предоставляет HMMDatabaseHandle
?
Хотя я полностью согласен с ответом @ Don't Panic, я должен также указать, что вы смешиваете статические методы и методы экземпляра.
Как правило, используйте ключевое слово static
, если вы хотите иметь возможность вызывать метод, не создавая экземпляр объекта в первую очередь. Если вы действительно хотите создать и использовать объект , то вы можете определить свой класс следующим образом и использовать $this->
(или $object->
, если он вне класса) вместо ::
для доступа к экземпляр свойства и методы.
<?php
class HMMDatabaseHandle
{
private $configfile = "config.json";
public function __construct()
{
// You're not initializing anything in here, so this constructor is optional.
}
public function create()
{
return $this->get_handle_admin();
}
private function get_handle_admin()
{
$config = json_decode(file_get_contents($this->configfile));
$dbhost = $config->database->dbhost;
$dbname = $config->database->dbname;
$dbuser = $config->database->dbuser;
$dbpass = $config->database->dbpass;
try {
return new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
}
catch (PDOException $e) {
echo $e->getMessage();
}
}
}
Чтобы действительно выполнить это, вам нужно создать экземпляр нового класса.
$dbManager = new HMMDatabaseHandle();
$handle = $dbManager->create();
Наконец, есть хитрость, которую вы можете использовать, чтобы сделать ваш конструктор цепным . Просто оберните его в скобки.
$handle = (new HMMDatabaseHandle())->create();