2010-08-19 2 views
3

Возможно, мне что-то не хватает, я не уверен. Поиск Google тоже не помог.Как создать экземпляр класса в другом классе

То, что я хочу сделать, это вызвать класс databaseServer и использовать его методы в моем классе userControl. Вот мой файл lib_class.php:

<?php 

include('definitions.php'); 

class databaseServer { 

    var $con; 
    var $db; 
    var $close; 
    var $qry; 
    var $sql; 

    function connect($host,$user,$pw,$db) { 
     $this->con = mysql_connect($host,$user,$pw); 
     if (!$this->con) { 
      die('Could not connect: ' . mysql_error()); 
      } 
     else { 
      echo "Database Connected"; 
      } 
     $this->selectDb($db); 
     } 

    function selectDb($database) { 
     $this->db = mysql_select_db($database,$this->con); 
     if (!$this->db) { 
      echo "Could not Select database"; 
      } 
     else { 
      echo "Database Selected"; 
      } 
     } 

    function disconnect() { 
     $this->close = mysql_close($this->con); 
     if ($this->close) { 
      echo "Disconnected"; 
      } 
     } 

    function query($test) { 
     if (!mysql_query($test)) { 
      die("Error: " . mysql_error()); 
      } 
     } 

} // databaseServer 

class cookie { 

    var $expireTime; 

    function set($name,$value,$expiry) { 
     $this->expireTime = time()+60*60*24*$expiry; 
     setcookie($name,$value,$expireTime); 
     } 

    function delete($name) { 
     setcookie($name,"",time()-3600); 
     } 

    function check($name) { 
     if (isset($_COOKIE["$name"])) 
      echo "Cookie Set"; 
     else 
      echo "Cookie failed"; 
     } 

} //cookie 

class userControl { 

    public function __construct(databaseServer $server) { 
     $this->server = new databaseServer(); 
    } 

    function createUser($uname,$pword) { 

     $this->server->connect(DB_HOST,DB_USER,DB_PASS,DB_NAME); 
     $result = $this->server->query("SELECT * FROM user_list WHERE uname='" . $this->server->real_escape_string($uname) . "'"); 
     if ($this->result->num_rows() === 0) { 

      if ($this->server->query("INSERT INTO user_list (uname, pword) 
      VALUES ('" . $this->server->real_escape_string($uname) . "','" . $this->server->real_escape_string($pword) . "')") { 
       echo "User Added Successfully!"; 
      } 
      else { 
       echo "Error Adding User!"; 
      } 
     } 

     else { 
      echo "User Already Exists!"; 
     } 

    } // createUser 

} // userControl 

?> 

Однако это не работает, и я не понимаю почему. Мои классы databaseServer и cookie отлично работают, когда я опускаю класс userControl из файла, поэтому я знаю, что ошибка должна быть в этом классе где-то. ООП - это то, что я пытаюсь изучить, и я продолжаю спотыкаться.

Отголоски в классе базы данных базы данных есть только для меня, чтобы проверить его. Я реализую классы в файле index.php следующим образом:

<?php 

include('definitions.php'); 
include('class_lib.php'); 

$bmazed = new databaseServer(); 

$bmazed->connect(DB_HOST,DB_USER,DB_PASS,DB_NAME); 

$sql = "INSERT INTO blah 
VALUES ('testing 92')"; 

$bmazed->query($sql); 

$bmazed->disconnect(); 

// $control = new userControl(); 

// $uname = "Test1"; 
// $pword = "test1"; 

// $control->createUser($uname,$pword); 

echo "<br />"; 
echo "<br />"; 

?> 

Линия закомментированую для целей тестирования, так что я не должен держать повторное написание кода.

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

+0

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

+0

@ Саладин запускает 'php -l lib_class.php', и вы увидите, что он жалуется на неожиданные' {'и' else' в блоке 'if', где вы делаете' INSERT'. Это потому, что вам не хватает закрывающего ')' на этом блоке 'if'. При разработке кода убедитесь, что включены 'error_reporting' и' display_errors'. – Gordon

ответ

2

Initialize $server в конструкторе:

class userControl { 

private $server; 

function __construct() { 
    $this->server = new databaseServer(); 
} 

function createUser($uname,$pword) { 
    $this->server->connect(DB_HOST,DB_USER,DB_PASS,DB_NAME); 
    $result = $this->server->query("SELECT * FROM user_list WHERE uname='" . $this->server->real_escape_string($uname) . "'"); 
    if ($this->result->num_rows() === 0) { 

    if ($this->server->query("INSERT INTO user_list (uname, pword) VALUES ('" . $this->server->real_escape_string($uname) . "','" . $this->server->real_escape_string($pword) . "')") { 
    echo "User added Succesfully"; 
    } 
    else { 
    echo "Error Adding User"; 
    } 

    else { 
    echo "User already exists"; 
    } 
} 

} 
+0

за исключением метода createUser, вы должны ссылаться на $ this-> server вместо $ server –

+0

@Mark Спасибо, исправлено! –

+1

«$ server» требуется ключевое слово. Либо «var», либо модификатор видимости. – Gordon

6

Вы не можете назначать свойства класса или экземпляра, которые зависят от информации о времени выполнения при объявлении классов. См. chapter on Class Properties in the PHP Manual.

Измените класс следующим образом:

class userControl 
{ 
    protected $_server; 

    public function __construct() 
    { 
     $this->_server = new databaseServer(); 
    } 
} 

Кроме того, для доступа к членам класса/экземпляра, вы должны использовать ключевое слово $this, например,

$this->_server->connect(); 

Замечание, что в то время как composition прекрасно, aggregation лучше. Это помогает вашему коду оставаться поддерживаемым и слабо связанным, что означает, что будет намного проще заменить компоненты, например, при написании UnitTests. Поэтому рассмотрите возможность изменения конструктора для использования Dependency Injection.

+4

Или даже лучше было бы использовать инъекцию зависимостей, чтобы поместить сервер базы данных в класс 'public funciton __construct (DatabaseServer $ server) {$ this -> _ server = $ server; } ' – ircmaxell

+0

Я не согласен с тем, что вы используете символы подчеркивания как префиксы переменных, учитывая, что ваш пример явно является кодом PHP5. –

+0

@Alan Я использую [стандарт кодирования ZF] (http://stackoverflow.com/questions/1798916/why-does-the-zend-framework-prepend-an-underscore-here/1799034#1799034), но не стесняйтесь не согласны с этим соглашением. В обозревателе [правила кодирования PEAR требуют подчеркивания для частных свойств, но больше не для защищенных свойств при использовании PHP5.] (Http://pear.php.net/manual/en/standards.naming.php) – Gordon

1

Для одного $ сервер не будет доступен изнутри CreateUser(), потому что это в другой области. Область PHP работает немного иначе, чем можно было бы ожидать от языка C-стиля.

Попробуйте либо передать сервер $ createOser(), либо инициализировать сервер в createUser(), и в этом случае у вас должна быть функция getServer(), чтобы вы не инициализировали ее без необходимости.

Третий вариант, безусловно, наихудший, который делает «глобальный $ server» наверху внутри функции. Но это очень плохая практика. Вы были предупреждены.

И последнее, но не менее важное: вы должны, вероятно, искать COUNT (*), чем * в SQL-запросе, потому что в противном случае вы выбираете всех пользователей. :)

Если вы хотите получить дополнительную информацию об области РНР, смотрите здесь (настоятельно рекомендуется): http://php.net/manual/en/language.variables.scope.php

Надеется, что это помогает!

0

Синтаксический материал, безусловно, был проблемой. Но еще более принципиально неправильно с моим кодом был тот факт, что метод queryServer-> query не возвращает значение. Возвращая значение, исправленная проблема.

Я думаю, что иногда невозможно увидеть лес для деревьев. :)

Смежные вопросы