2014-09-04 3 views
0

У меня просто есть простой вопрос ... Я работал над разработкой приложения для форума для своего сайта и при обновлении некоторых старых методов, которые я использовал (мой старый код ужасно) Я столкнулся - не в первый раз - устройства ООП.Требовать() использовать класс для использования в наследовании

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

Я пытался использовать require() на базовый класс, то расширить класс отходящими от него ...

<?php 
require(//path to base class); 

class User extends BaseClass { 
// code 
} 
?> 

Но я не знаю, как проверить, если она есть, и это Безразлично» кажется, т будет наследовать только функцию базового класса ...

public function __get($what) { 

if(property_exists($this, $what)) { 

return $this->{$what}; 

} else { 

return null; 

} 

} 

Так как, когда я пытаюсь получить переменную из класса User (например $user->Username) она возвращает NULL. Переменная отмечена как private в классе, но прежде чем я попытался сделать наследование, это не было проблемой.

+0

Если 'require' не может добавить файл, он все равно остановит сценарий, не так ли? В чем проблема ? Вы не уверены, что BaseClass находится в файле, который вам нужен? – Sugar

+0

Ну, я полагаю, чтобы яснее моя проблема, о чем я упомянул в конце; __get, который я определил в BaseClass, не работает, как это было, когда я просто определил его в User. Я не уверен, что это потому, что он не работает в наследовании, или если что-то не так с наследованием от класса require() 'd. – Splashsky

+2

Я подозреваю, что у вас есть переменная $ Username в вашем BaseClass? Тогда вы должны сделать его защищенным. Частные переменные видны только для действительного класса, защищенные также видны для расширения классов. –

ответ

1

Похоже, вы хотите получить после своих переменных в своем родительском классе, но не хотите использовать методы геттера для этого. Маркировка этих переменных protected действительно позволит вашим дочерним классам получить доступ к этим свойствам, но в тех случаях, когда вы хотите, чтобы ваш базовый класс выполнял обработку перед настройкой/получением, маркировка свойств protected не будет сокращать его.

В вашем случае это звучит так, как вы отмечаете переменные protected в качестве обходного пути. Однако вы все еще можете использовать private переменные в базовый классе и разрешить доступ к ним в своих дочерних классах следующим образом:

class BaseClass 
{ 
    private $strValue = "We the people...."; 

    public function __get($what) 
    { 
     if(isset($this->{$what})) { 
      return $this->{$what}; 
     } 
     return null; 
    } 
} 

class ChildClass extends BaseClass 
{ 
    private $intValue = 255; 

    public function __get($what) 
    { 
     if(isset($this->{$what})) { 
      return $this->{$what}; 
     } else if(parent::__get($what) != null) { 
      return parent::__get($what); 
     } 
     return null; 
    } 
} 

//Try it out 
$child = new ChildClass(); 
var_dump($child->strValue); //"We the people...." 
var_dump($child->intValue); //255 

В этом примере BaseClass использует магический метод __get() для поиска своих собственных свойств и ChildClass переопределяет его сделать то же самое. В ChildClass, если он не может найти запрашиваемое свойство, он переводит его в родительскую версию.

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

0

просто используйте class_exists(), чтобы убедиться, что ваш класс существует.

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