2013-06-24 3 views
0

Я новичок в php oop, поэтому немного борюсь.Вызов функции-члена для не-объекта

У меня есть класс подключение к базе данных а именно:

class config{ 

    protected $HOST = "localhost"; 
    protected $USERNAME = "something" ; 
    protected $PASSWORD = "something"; 
    protected $DATABASE = "something"; 

// Constructor - open DB connection 
function __construct() { 

try { 
    $this->db = new mysqli($this->HOST, $this->USERNAME, $this->PASSWORD, $this- 
    >DATABASE); 
    $this->db->autocommit(FALSE); 
    } 
catch(Exception $e) 
    { 
    if($this->db->connect_errno > 0){ 

    echo 'Caught exception: ', $e->getMessage(), "\n"; 
    } 
    } 

    } 

    // Destructor - close DB connection 
    function __destruct() { 
    $this->db->close(); 
    } 


} 

$api = new Config(); 

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

второй класс:

class Myclass extends config { 

    function __construct(){} 

    public function myfunction() 
    { 
    try{ 


    $stmt = $this->db->stmt_init(); /* Error here : Fatal error: Call to a member     
              function stmt_init() on a non-object */ 
$query = "SELECT ABC FROM table " ; 

$stmt = $this->db->prepare($query); /* Error here : Fatal error: Call to a member     
              function prepare() on a non-object */ 
     } 
    catch(){} 

    } 

    } 

Пожалуйста, наставит меня с надлежащей процессуальной фрагменте кода

+0

Правильное средство защиты - это не больше кода, оно учит отлаживать то, что у вас уже есть. – Jon

+0

Что такое ошибка fata? – DevZer0

+0

Я прокомментировал это в своем коде. Пожалуйста, посмотрите на фрагмент кода второго класса. – Nikhil

ответ

0

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

class Myclass extends config { 

    function __construct($h, $u, $p, $d){ parent::__construct($h, $u, $p, $d); } 

Кроме того, вы не имеете $db свойство в родительском классе, так что добавьте

class config{ 

    protected $db; 
    protected $HOST = "localhost"; 
    protected $USERNAME = "something" ; 
    protected $PASSWORD = "something"; 
    protected $DATABASE = "something"; 

Edit: Dependency Injection подход:

class config{ 
    public $HOST = "localhost"; 
    public $USERNAME = "something" ; 
    public $PASSWORD = "something"; 
    public $DATABASE = "something"; 
} 

class Myclass 
{ 
    protected $db; 

    function __construct($db) 
    { 
     $this->db = $db; 
    } 

    public function myfunction() 
    { 
     // do whatever with $this->db 
    } 
} 

$config = new Config(); 

try 
{ 
    $db = new mysqli($config->HOST, $config->USERNAME, $config->PASSWORD, $config->DATABASE); 
    $db->autocommit(FALSE); 
} 
catch(Exception $e) 
{ 
    if($db->connect_errno > 0){ 
     echo 'Caught exception: ', $e->getMessage(), "\n"; 
    } 
} 

$myclass = new Myclass($db); 

Посмотрите в зависимость Инъекции. Это благоприятный подход для работы с классами, которым необходим доступ к базе данных. Вместо того, чтобы все классы расширяли базу данных, просто передайте объект datsbase в качестве параметра при создании новых классов (которые нуждаются в db).

+0

Привет, спасибо! это сработало ... хотелось бы узнать немного больше Если вместо расширения класса я использую require_once ('Config.php'); , то какие изменения мне нужно сделать .... , потому что таким образом я не могу получить родительский конструктор ... – Nikhil

+0

Без расширения вы можете создать '$ db' вне обоих классов, а при создании новых объектов на основе классы, передайте '$ db' конструкторам и пусть класс сохранит его как свойство, поэтому классы все равно могут использовать' $ this-> db'. – MrCode

+0

было бы здорово, если бы вы могли объяснить мне это с помощью небольшого примера – Nikhil

0

Ваш производный класс конструктор не называет базовый конструктор, так $this->db не имеет значения, что это предполагается. В PHP you must do this explicitly.

В этом конкретном случае вы должны полностью удалить производный конструктор, поскольку он ничего не делает. Это позволит PHP напрямую использовать базовый конструктор.