У меня есть контейнерный класс:
class ContainerClass {
var $subobj;
var $myName;
function __construct($val, $name)
{
$this->myName = $name;
$this->subobj = new ItemClass ($val);
}
function getItem()
{
return ($this->subobj);
}
}
и класс:
class ItemClass {
var $value;
function __construct($val)
{
$this->value = $val;
}
}
Эти два класса являются членами гипотетической библиотеки, которую можно использовать во многих проектах, просто используя include
вызов.
В моих проектах мне нужно сделать какое-то конкретное отображение, поэтому для каждого проекта, Я хотел бы, не изменяя исходный код библиотеки, добавить методы, подобные этим (с конкретным содержанием проекта):
ContainerClass
:function getDisplay () {
return ($myName . " : " . $this->subobj->getDisplay());
}
ItemClass
:function getDisplay () {
return (/* some display */ $this->value);
}
function getDisplayAlone () {
return (/* some display */"<DIV>" . $this->value . "</DIV>");
}
function getDisplay () {
if ($this->value == 5) return ($myName . " : " . $this->subobj->getDisplay());
return ("No luck !");
}
ItemClass
:function getDisplay () {
return (/* some display */"Go to hell !");
}
function getDisplayAlone () {
return (/* some display */"<DIV>What's up doc ?</DIV>");
}
И быть в состоянии вызвать их из моего основного файла PHP из каждого проекта:
include "mylibrary.php";
$obj = new ContainerClass (10, "Me");
$obj->getDisplay();
$obj->getItem()->getDisplayAlone();
Я нашел много советов и приемов для добавления методов к классам и объектам, но они либо не работают на php5, не позволяют использовать $this
внутри методы или не работает вообще.
Может ли кто-нибудь помочь мне добиться этого?
Предполагая, что это будут ваши классы библиотеки:
class ContainerClass
{
protected $subobj; //Must be protected to be accessable for the child classes
protected $myName; //Must be protected to be accessable for the child classes
function __construct($val, $name)
{
$this->myName = $name;
$this->subobj = new ItemClass ($val);
}
function getItem()
{
return ($this->subobj);
}
}
class ItemClass {
private $value;
function __construct($val)
{
$this->value = $val;
}
}
Если вы хотите реализовать разные функции для каждого проекта, вам нужно переопределить ваши классы библиотеки. Так, например Project1ItemClass
расширяет библиотеку ItemClass
учебный класс. Вот пример:
class Project1ItemClass extends ItemClass {
function getDisplay () {
return (/* some display */ $this->value);
}
function getDisplayAlone () {
return (/* some display */"<DIV>" . $this->value . "</DIV>");
}
}
class Project1ContainerClass extends ContainerClass {
//Override the constructor cause you want to create a project 1 specific ItemClass
function __construct($val, $name)
{
$this->myName = $name;
$this->subobj = new Project1ItemClass ($val);
}
function getDisplay () {
return ($this->myName . " : " . $this->subobj->getDisplay());
}
}
Этот пример ниже напечатает: qwe : asd
$Project1ContainerClass = new Project1ContainerClass("asd","qwe");
echo $Project1ContainerClass->getDisplay();
Обратите внимание, что вы должны переопределить ваш конструктор в конкретном проекте ContainerClass
потому что вы создаете новый экземпляр ItemClass
в этом. Если вы не переопределяете конструктор, вы создаете экземпляр ItemClass
в то время как ваше намерение является примером Project1ItemClass
,
использование extends
class ProjectItemClass extends ContainerClass {
function getDisplay () {
return (/* some display */ $this->value);
}
function getDisplayAlone () {
return (/* some display */"<DIV>" . $this->value . "</DIV>");
}
}
class ProjectContainerClass extends ContainerClass {
public function __construct($val, $name) {
$this->myName = $name;
$this->subobj = new ProjectItemClass ($val);
}
function getDisplay () {
return ($myName . " : " . $this->subobj->getDisplay());
}
}
class ProjectItemClass extends ContainerClass {
function getDisplay () {
return (/* some display */"Go to hell !");
}
function getDisplayAlone () {
return (/* some display */"<DIV>What's up doc ?</DIV>");
}
}
class ProjectContainerClass extends ContainerClass {
public function __construct($val, $name) {
$this->myName = $name;
$this->subobj = new ProjectItemClass ($val);
}
function getDisplay () {
if ($this->value == 5) return ($myName . " : " . $this->subobj->getDisplay());
return ("No luck !");
}
}
Убедитесь, что вы добавили / потребовали эти новые классы после исходных классов, а затем используете их следующим образом:
$obj = new ProjectContainerClass (10, "Me");
$obj->getDisplay();
$obj->getItem()->getDisplayAlone();
Обратите внимание на переопределение __construct
чтобы убедиться, что ProjectItemClass
используется вместо ItemClass
, Вы также можете использовать parent
вызов, чтобы убедиться, что все изменения в конструкции расширенного класса все еще используются (но $this->subobj
просто позвонят дважды.)
public function __construct($val, $name) {
parent::__construct($val, $name);
$this->subobj = new ProjectItemClass($val);
}