PHP не может найти функцию в моем классе - PullRequest
1 голос
/ 04 января 2010

У меня вызывается класс, и по какой-то причине одна из моих функций обнаруживается, а другая - нет. Вот мой код:

<?php


namespace LMVC\Database;

class PDO
{
private static $instance = NULL;

public static function setup($dsn, $username, $password)
{
    try {
        self::$instance = new \PDO($dsn, $username, $password);
    }
    catch(PDOException $e) {
        throw new Exception("Error: " . $e->getMessage());
    }
}

public static function getInstance()
{
    if(self::$instance === NULL) {
        throw new Exception("Database is not instantiated");
    }

    return self::$instance;
}

public function query($sql)
{
    if(self::$instance === NULL) {
        throw new Exception("Database is not instantiated");
    }

    try {
        return self::$instance->query($sql);
    }
    catch(PDOException $e) {
        throw new Exception("Error: " . $e->getMessage());
    }
}

public function fetchAll($stmt)
{
    if(self::$instance === NULL) {
        throw new Exception("Database is not instantiated");
    }

    try {
        return self::$instance->fetchAll($stmt);
    }
    catch(PDOException $e) {
        throw new Exception("Error: " . $e->getMessage());
    }
}

public function prepare()
{

}

public function quote()
{

}
}

Все функции, кроме fetchAll, можно найти, но fetchAll - нет. Кажется, я не могу добавить функции, которые существуют. Когда я изменяю имя fetchAll на что-то другое, он не может найти фунтоктин, на который я его переименую. Кроме того, когда я избавляюсь от функций, которые могут быть найдены, таких как цитата, запрос и подготовка, php все еще может их найти, я тестировал, используя var_dump с функцией. Я попытался перезапустить Apache, перезапустить Windows 7. Я использую PHP 5.3.1.

Любые другие идеи о том, как отлаживать? Кажется, я не могу выяснить, как заставить работать журнал ошибок, отредактировав мой файл php.ini.

Ответы [ 4 ]

2 голосов
/ 04 января 2010

Возможно, вы реализуете предустановленный PHP PDO Object . Вы пытались создать экземпляр объекта непосредственно с помощью пути к пространству имен? например,

$foo = new LMVC\Database\PDO;

В противном случае PHP может создавать свой собственный объект с именем PDO, который находится в корневом пространстве имен.

РЕДАКТИРОВАТЬ ДЛЯ БОЛЬШЕ ИНФОРМАЦИИ

Если вы включаете файл, который определяет этот класс, и вы не указываете пространство имен в файле, в котором создается этот класс, то PHP будет рассматривать только объявленное пространство имен, действующее при выполнении файла, который определяет учебный класс. За пределами этого включаемого файла он будет использовать отступ пространства имен для объявления глобального объекта.

Вы должны, поскольку PDO - это существующий глобальный объект, переименовать ваш класс (возможно, myPDO?), Чтобы избежать такого рода путаницы в будущем.

1 голос
/ 04 января 2010

Вы пытались переименовать класс? Возможно, ваш код на самом деле пытается использовать встроенный в PHP объект PDO.

0 голосов
/ 04 января 2010

Переименуйте ваш класс PDO во что-то другое, например PDOImplementation, и попробуйте снова.

0 голосов
/ 04 января 2010

Я еще не работал с пространствами имен, но держу пари, что вы инициализируете обычный объект PDO, а не тот, который вы определяете в своем пространстве имен.

Вы устанавливаете правильное пространство имен при инициализации своего класса?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...