функция-член класса в функции? - PullRequest
2 голосов
/ 01 сентября 2010

Так что у меня есть этот класс, который включает в себя некоторые пользовательские функции с именем class.php У меня есть другой файл с именем config.php, который включает в себя

require('engine.class.php');
$engine = new engine;

config.php также требует, чтобы functions.php работал как:

require('functions.php');

У меня есть функция в functions.php, которая использует $ engine, например:

function login($username, $password){
    return $engine->mysql_query('SELECT `user_id` WH...', 'array);//this is custom function in class.php
}

но когда я запускаю страницу, которая требует config.php, я получаю сообщение об ошибке вроде:

Fatal error: Call to a member function mysql_query() on a non-object in ../somedir/functions.php on line 3

Ответы [ 2 ]

2 голосов
/ 01 сентября 2010

Глобальные переменные неоспоримо зло . Любой, кто говорит вам использовать их, не имеет опыта работы с кодом, который их использует. К сожалению, по моему опыту, гораздо больше PHP-кодеров используют глобальные переменные, чем любой другой язык, в основном из-за незнания.

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


PHP кэширует соединения с БД, так что вы можете иметь неограниченное количество mysql_connect () в одной и той же программе, и он будет подключаться только один раз за загрузку страницы (если вы не закроете ее вручную). Поэтому немедленно удалите $ engine из вашего config.php и перепишите весь свой код следующим образом:

function login($username, $password)
{
    $engine = new Engine;
    //this is custom function in class.php
    return $engine->mysql_query('SELECT `user_id` WH...', 'array);
}

Я с радостью объясню * еще 1016 *, если вам это нужно.

2 голосов
/ 01 сентября 2010

Вам нужно будет обратиться к Область действия переменных . Поскольку вы не можете получить доступ к $ engine, если он не является глобальным или не определил / не объявил его ( шаблон синглтона * ) внутри функции.

EDIT

Вы также можете передать его в качестве параметра функции (ранее забыл упомянуть об этом).

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