2009-07-31 2 views
1

Я кодирую свою первую фабрику объектов, и мне интересно, есть ли какие-либо недостатки в передаче одного объекта в другой при создании второго объекта, а затем сохранение первого объекта во втором для использования позже?Можно ли передать объект класса другому классу? PHP

Пример:

class main 
{ 
    public $connection = array(); 

    // various other useful functions that should be loaded on every page here 
    // these other functions would be convenient to have avail for 
    // new objects in different classes 

    function dbconnect($db) { 
     if(!isset($this->connection[$db])) { 
      switch($db) { 
       case "users": 
        $connection = @mysql_connect(info,info,info); 
        $db_select = @mysql_select_db(info,$connection); 
        $this->connection[$db] = $connection; 
       break; 

       case "ads": 
        $connection = mysql_connect(info,info,info); 
        $db_select = mysql_select_db(info,$connection); 
        $this->connection[$db] = $connection; 
       break; 

       default: 
        die($db . " is not a recognized database."); 
       break; 
      } 
     } 

     return $this->connection[$db]; 
    } 

    // note how i pass $this into the new object in this function 
    function create($class,$params=null) { 
     if(!class_exists($class) && !$this->load($class)) { 
       die($class . " is not a recognized class."); 
     }else{ 
       return new $class($this,$params); 
     } 
    } 

    function load($file) { 
     $file = $_SERVER['DOCUMENT_ROOT'] . "/classes/" . $file . ".class.php"; 
     if(file_exists($file)) { 
       return require_once($file); 
     }else{ 
       return false; 
     } 
    } 
} 

class secondary { 

    private $connection; 
    private $mainObj; 
    private $params; 

    function __construct($mainObj,$params) { 

     $this->mainObj = $mainObj; 
     $this->params = $params; 

     $this->connection = $mainObj->dbconnect('users'); 

    } 
} 

Как вы видите здесь, любой класс, созданный на заводе удобно имеет возможность подключения к БД MySQL, если класс требует (и других общих/полезных функций) ... без необходимости использовать глобалы или передавать много вещей.

Является ли это стабильным способом? Я новичок и могу использовать какую-то хорошую теорию/учебу о том, почему это неправильно - если это так.

+0

Вы можете прочитать о Dependency Injection. http://en.wikipedia.org/wiki/Dependency_injection – jason

ответ

4

Да, это довольно стабильный путь. Но я хотел бы видеть type hinting в методах, принимающих внешние экземпляры в качестве параметров, которые сделают ваши классы более сильными.

Пример;

class Alob { 
    public function aMethod(**Blob** $outerObject) { 
     ... 
    } 
} 

class Blob { 
    ... 
} 

Это бросит роковую ошибку, если Alob :: aMethod() вызывается с другим типом, чем Blob.

Я также хотел бы видеть дополнительные ключевые слова для доступа для определения видимости, скрыть ваши рядовые рядовые с помощью «private» и так далее.

+0

ладно, я не шел по этому пути раньше ... с типом намека ... я думаю, я не понимаю его необходимости ...но я проверю, что вы оставили ссылку :) – johnnietheblack

+0

только что прочитал по типу намека ... я получаю это - он ЗАМЕТКИ этот параметр как мой объект, который Im передает, так как это то, что класс должен будет выжить. в приведенном выше примере он должен быть объектом класса «main». благодаря! – johnnietheblack

2

Для этого вам нужно быть осторожным, если бы это решение сохраняло объект, обращающийся к DB (что неплохо, вы должны прочитать о шаблоне «Зависимость впрыска», btw), это не отсоединиться от БД до тех пор, как вы все равно должны быть в состоянии получить доступ к этому
(Да, кажется, довольно логично ^^)

то, что я имею в виду, это может стать легко забыть, что какой-то объект где-то нуждается в БД соединение не должно быть закрыто.

Простым способом было бы никогда не отключать - PHP будет автоматически закрывать соединение с сервером БД в конце сценария.

+0

Я обязательно прочитаю об инъекции зависимостей ... однако мне не хватает риска, о котором вы говорили, с закрытием db? если у меня нет каких-либо функций закрытия в любом месте, в любом классе, к которому объект может быть передан, у меня не должно быть проблем, верно? или нет? спасибо за ваши ответы :) – johnnietheblack

+0

Если вы никогда не отключитесь, нет, у вас не будет проблемы (и именно поэтому я бы сделал ^^); извините, если я не прояснил :-( –

4

Определенно нет ничего плохого в передаче объекта. Если у вас есть объект ClassB, для которого требуется экземпляр объекта ClassA, то ваши единственные возможности - создать этот объект ClassA внутри ClassB или передать ClassA в.

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

Поскольку PHP5 автоматически передает объекты по ссылке, настройка ссылки внутри вашего класса secondary на $mainObj на самом деле очень эффективна.

2

Это не только хорошо, но на самом деле это одна из основ объектно-ориентированного программирования, и это называется aggregation

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