Класс PHP Singleton — фатальная ошибка: вызов приватного MyObject :: __ construct ()

Синглтон класс:

<?php

class db_singleton
{
const ORACLE_HOST = "SOMEIP";
const ORACLE_USER = "validuser";
const ORACLE_PASS = "validpass";
const ORACLE_DB = "SOMEIP/DBNAME";

private static $instance; // stores the oci_* instance

private function __construct() { } // block directly instantiating

private function __clone() { } // block cloning of the objectpublic static function call()
{

// create the instance if it does not exist
if(!isset(self::$instance))
{
// the ORACLE_* constants should be set to or
//  replaced with your db connection details
self::$instance = oci_connect(self::ORACLE_USER, self::ORACLE_PASS, self::ORACLE_DB);
if(self::$instance->connect_error)
{
throw new Exception('Oracle connection failed: ' . self::$instance->connect_error);
}
}
// return the instance
return self::$instance;
}public function __destruct() {
oci_close($instance);
}

public function queryresult($query)
{

$result_set_array =array();
$this->stmt = oci_parse($this->con, $query);
oci_execute($this->stmt);

while($row=oci_fetch_array($this->stmt,OCI_ASSOC+OCI_RETURN_NULLS))
{

$result_set_array[] = $row;
}
oci_free_statement($this->stmt);
return $result_set_array;

}
}
?>

Когда я пытаюсь использовать singleton Класс с кодом ниже, он работает отлично и получить результаты.

$conn = db_singleton::call();
$stid = oci_parse($conn, 'SELECT * FROM somevalid_table');
oci_execute($stid);
while($result=oci_fetch_array($stid,OCI_ASSOC+OCI_RETURN_NULLS))
{
$result_set_array[] = $result;
}

Теперь, когда я пытаюсь расширить свой класс с помощью модели, он выдает исключение

class Myclass Extends db_singleton{

public function someModel()
{

$result = parent::queryresult(" select * from somevalid_table");
return $result;
}
}

Исключение:

 Fatal error: Call to private db_singleton::__construct() from context 'someController'

Я знаю, что класс не может быть создан с использованием частного конструктора. __construct () функции всегда вызываются, когда создается объект, поэтому пытается сделать что-то вроде $ x = новый MyObject () вызовет фатальную ошибку с частной функцией построения.

я использую Singleton классы для предотвращения прямой реализации объекта. Как я могу преодолеть проблему? Какое будет лучшее решение?

Благодарю.

-1

Решение

$x = new MyObject() никогда не будет работать, если ваш конструктор является закрытым в этом классе, потому что __construct() это первый метод, который вызывается при создании объекта.

Create a public method
/**
* Singleton class
*
*/
final class UserFactory
{
/**
* Call this method to get singleton
*
* @return UserFactory
*/
public static function Instance()
{
static $inst = null;
if ($inst === null) {
$inst = new UserFactory();
}
return $inst;
}

/**
* Private ctor so nobody else can instance it
*
*/
private function __construct()
{

}
}

Использовать:

$fact = UserFactory::Instance();
$fact2 = UserFactory::Instance();

$fact == $fact2;

Но:

$fact = new UserFactory()
0

Другие решения

PHP Class Script:

class db_singleton
{
const ORACLE_USER = "validuser";
const ORACLE_PASS = "validpass";
const ORACLE_DB = "SOMEIP/DBNAME";

private static $instance = null; // stores the oci_* instance

// private constructor
private function __construct() { } // block directly instantiating

private function __clone() { trigger_error('Clone is not allowed.', E_USER_ERROR); } // block cloning of the object

public static function getInstance()
{

// create the instance if it does not exist
if(!isset(self::$instance))
{
// the ORACLE_* constants should be set to or
//  replaced with your db connection details
self::$instance = oci_connect(self::ORACLE_USER, self::ORACLE_PASS, self::ORACLE_DB);
if(self::$instance->connect_error)
{
throw new Exception('Oracle connection failed: ' . self::$instance->connect_error);
}
}
// return the instance
return self::$instance;
}

public static function queryresult($query)
{

$result_set_array =array();
$stmt = oci_parse(db_singleton::getInstance(), $query);
oci_execute($stmt);

while($row=oci_fetch_array($stmt,OCI_ASSOC+OCI_RETURN_NULLS))
{
$result_set_array[] = $row;
}
oci_free_statement($stmt);
return $result_set_array;

}

Теперь, чтобы предотвратить Fatal error: Call to private db_singleton::__construct()Я добавил empty constructor к моему child class который model класс в моем случае. Это переопределит конструктор родительского класса, который является закрытым.

class Myclass Extends db_singleton{

public function __construct() {}

public function someModel(){

$result = parent::queryresult(" select * from somevalid_table");
return $result;
}
}

Надеюсь, это поможет кому-то.

Благодарю.

0

По вопросам рекламы [email protected]