Hallo,

Bestaat er een mogelijkheid om functies toe te voegen aan een class. Ik ben vna plan om een aantal plugins te gaan makenen dia via classes in de hoofd class toe te voegen.

Bijv.
<?php
class clsMain{

private $addons = Array();

public function __construct(){

}

public function startAddon($name){
if(in_array($name, $this->addons)){
call_user_func($name);
}
}

public function addAddon($name){
$this->addons[] = $name;
}
}

$main = new clsMain();
?>

<?php
class ADDON_TEST{

// Deze toevoegen een de class clsMain
public function addon_test(){
echo 'Hello World';
}

}

$main->addAddon('addon_test');
?>

dus de function addon_test() toevoegen aan de class clsMain.
Mooier is om dat met objecten te doen:
<?php
interface Plugin
{
public function call();
public function getName();
}

// Kan ook
interface Plugin_Aware extends Plugin
{
public function setPlugable(Plugable $plugable);
}

abstract class Plugable
{
protected $plugins = array();
public function registerPlugin(Plugin $plugin)
{
$this->plugins[$plugin->getName()] = $plugin;
if($plugin instanceof Plugin_Aware)
$plugin->setPlugable($this);
}

public function callPlugin($name, $args = array())
{
if(isset($this->plugins[$name]))
return call_user_func_array(
array($this->plugins[$name], 'call'),
$args
);

throw new InvalidArgumentException(sprintf('Plugin "%s" not found', $name));
}
}

abstract class Plugable_Magic
{
public function __call($name, $args)
{
try {
return $this->callPlugin($name, $args);
}
// Deze exception is netter
catch(InvalidArgumentException $e) {
throw new BadMethodCallException($e->getMessage());
}
}
}
?>
Hoezo dat?
Ik roep geen interne methodes aan met die functie. Wel goed kijken...
ohw slecht gekeken...Maar aan de ts, let er wel mee op hoe dit te gebruiken
Ja inderdaad, ben momenteel een beetje de draad kwijt. Want heb een template engine gemaakt in een class. Maar ik wil ook dat ik er addons ik kan gaan verwerken. Ik ben er nog niet helemaal over uit hoe ik dit wil gaan doen.
Snap je mijn voorbeeld een beetje? Zo niet, wat niet?
Pim - op 28/02/2011 19:03:06

Snap je mijn voorbeeld een beetje? Zo niet, wat niet?


interface Plugin etc.. wat betekend interface dan allemaal?

En voor de CMS die ik aan het maken ben, heb ik veelal verschillende classes gemaakt. voor zoals het parsen van de template, de foutberichten etc.. Of is het verstandiger om alles in een enkele class te zetten?
Als je nog niet de beginselen van OO kunt raad ik je deze tutorial aan die je even klaarstoomt voor de beginselen van het OO denken, programmeren etc.

http://phptuts.nl/view/45/
Niels Kieviet op 28/02/2011 19:14:58

Als je nog niet de beginselen van OO kunt raad ik je deze tutorial aan die je even klaarstoomt voor de beginselen van het OO denken, programmeren etc.

http://phptuts.nl/view/45/


Ik weet wel hoe OOP werkt ;) Dat is het probleem niet.
Echter de communicatie tussen de classes is een beetje verwarrend.
Een iets simpeler voorbeeld:
<?php
interface Plugin
{
// De daadwerkelijke functie
public function call();
// Geef de naam van de plugin als string terug
public function getName();
}

abstract class Plugable
{
protected $plugins = array();
public function registerPlugin(Plugin $plugin)
{
$this->plugins[$plugin->getName()] = $plugin;
}

// Roep aan
public function callPlugin($name, $args = array())
{
if(isset($this->plugins[$name]))
return call_user_func_array(
array($this->plugins[$name], 'call'),
$args
);

throw new InvalidArgumentException(sprintf('Plugin "%s" not found', $name));
}
}
?>

Reageren