class — PHP: добавить методы, вызывающие $ this, к существующим классам

У меня есть контейнерный класс:

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>");
}

Для ContainerClass:

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 внутри методы или не работает вообще.

Может ли кто-нибудь помочь мне добиться этого?

0

Решение

Предполагая, что это будут ваши классы библиотеки:

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,

0

Другие решения

использование extends

Проект 1

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());
}

}

Проект 2

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);
}
0

По вопросам рекламы [email protected]