php неопределенная переменная класса - PullRequest
0 голосов
/ 13 февраля 2012

Хорошо, я создал отдельный класс для подключения к моей базе данных, и этот класс находится в отдельном файле php

connect.php

class connect{
    function __construct(){
        // connect to database
    }
    function query($q){
        // executing query
    }
}
$connect = new connect();

Теперь я создал объект класса $ connect, и при использовании его в файле, подобном index.php, он работает

index.php

require_once('connect.php');
$set = $connect->query("SELECT * FROM set");

Теперь здесь все работает нормально, мне не нужно заново создавать объект для класса и напрямую выполнять запрос, где, как и в другом файле с именем header.php, у меня есть такой класс

header.php

class header{
    function __construct(){
    require_once('connect.php');
    // Here the problem arises i have to re declare the object of the connection class
    // Without that it throws an error undefined variable connect
    $res = $connect->query("SELECT * FROM table");
    }
}

почему он работает с index.php, а не с header.php, и я надеюсь, вы понимаете, что я пытаюсь сказать

1 Ответ

2 голосов
/ 13 февраля 2012

Возможно, ваша проблема в использовании require_once() вместо require(). Когда вы включили connect.php в первый раз, это работало хорошо, потому что переменные были инициализированы и загружен класс, но когда вы попытались позже, require_once() запретил повторное включение, и поэтому никакая переменная не была инициализирована.

В любом случае использование include() внутри конструктора ... редко оправдано. И включать файл, который будет инициализировать локальные переменные, тоже плохая идея.

Правильный код будет выглядеть так:

<?php
require_once( 'connect.php');
require_once( 'header.php');

$connect = new Connect();
$header = new Header( $connect);

И header.php:

<?php
class Header{
    protected $connection = null;

    function __construct(Connect $connection){
        $this->connection = $connection;
        $res = $this->connection->query("SELECT * FROM table");
    }
}

Редактировать: удалена вводящая в заблуждение часть кода о объявлении класса nasted с помощью include (см. Комментарий Гордона и историю редактирования) ...

...