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