2015-09-28 2 views
0

Итак, у меня есть два класса PHP: User & Connection.Использование внешнего объекта внутри объявления класса - PHP

То, что они делают, очевидно из их названий.

Теперь предположим, что у меня есть этот код:

User.php

<?php 

class User { 

    static function get_email($user_id) { 
     $conn_object = new Connection(); 
     $connection = $conn_object->connection; 
     // do stuff with the connection object 
    } 

} 

?> 

Connection.php

<?php 

class Connection { 

    public $connection; 

    public function __construct() { 
     $this->connection = // connect to the database here 
    } 

} 

?> 

main.php

<?php 

require "Connection.php"; 
require "User.php"; 

$email = User::get_email(4); // this doesn't work 

?> 

Wh ru Я делаю что-то подобное в main.php, я получаю кучу ошибок. Когда я var_dump($conn_object); в файле User.php, я всегда получаю null, как будто файл даже не «видит» объект Connection, или знает, что он существует.

Однако, когда я использую класс Connection в main.php, я не получаю никаких ошибок, и все работает плавно. Это означает, что у моего объекта Connection нет синтаксических ошибок или нет.

Нельзя ли это делать на PHP? Не позволяет ли язык использовать класс в классе?

+0

Предоставьте эти ошибки. Ваш код работает без ошибок. – Styx

+0

удалил все «помощь» и «спасибо» – Phani

ответ

0

FYI: Я пытаюсь ответить на вопрос, как если бы я спрашивал его в первый раз, и попытаться включить столько информации, сколько было бы необходимо кем-то, кто не имеет столько знаний, как вы или я Это облегчает тем, кто просто учится находить ответы.

require "Connection.php";

require "User.php";

$email = User::get_email(4); // this doesn't work

«::» ссылки родительский метод, так что если вы не продлили класс соединения с классом пользователя, он не будет работать. И даже если у вас есть, это не гарантирует работу, что, скорее всего, означает, что я сделал что-то не так, когда пытаюсь.

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

$thisConnection = new Connection(); $thisUser = new User(); $thisUser = new User($thisConnection); или $thisUser->setConnection($thisConnection);

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

Однако, как было отмечено Хоакин Хави, объектно-ориентированное программирование использует наследование и дочерние объекты наследует и имеет доступ к методам родительских объектов.

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

С другой стороны, если у вас есть определенная причина, по которой вы не хотите использовать расширения и ярлык наследования, вам необходимо передать объект Connection в объект User.

Чтобы быть понятным, когда вы расширяете класс Connection классом пользователя, класс пользователя наследует методы, а также переменные класса соединения, если они установлены на общедоступные или защищенные, и вы будете быть в состоянии получить доступ к любому переменному или методе, таким как get_email следующий способ:

$thisUser->get_email(4);

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

+0

Включение объекта 'Connection' в объект' User' кажется оптимальным для этого. Боковой вопрос: если у меня есть родительский класс с переменной 'private protected ', может ли подкласс по-прежнему обращаться к этой переменной? Спасибо за вашу помощь. – Joe

+0

По какой-либо причине, если для переменной или метода установлено значение private, дочерний класс/подкласс не сможет получить к нему доступ. –

0

Помните о методах или свойствах общего доступа к классам путем наследования или наложения.

<?php 

class Connection { 

    protected $connection; 
    //we changed protected because only direct inherit can acces 

    public function __construct() { 
     $this->connection = // connect to the database here 
    } 

} 

<?php 

include connection.php... 

class User extends Connection{ 

     function __construct(){ 
     parent::contruct(); 
     } 

    static function get_email($user_id) { 

     $this->connection->yourDbstuff ; 
     // do stuff with the connection object 
    } 

} 

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