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.
Misschien heb ik het niet helemaal goed uitgelegd hoe het precies moet. Of wat ik wil. Hier heb ik dan ook een linkje met een hopelijk betere uitleg. http://test.development-server.nl/class_test/
Maar stel, er komt later nog een extra plugin. En ik wil youtube video's embedden door [#youtube 5Y0AhNz3zgU#] te typen het word omgezet in <object width="480" height="390"><param name="movie" value="http://www.youtube.com/v/5Y0AhNz3zgU?fs=1&hl=nl_NL"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/5Y0AhNz3zgU?fs=1&hl=nl_NL" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="390"></embed></object>
Je hebt dan twee keuzes:
- Elke helper geeft 1 helper functie, dat doet mijn code
- Elke publieke functie van de helper is beschikbaar, dat maakt het registreren een klein beetje lastiger.
Optie 1:
<?php
interface Helper
{
// De daadwerkelijke functie
public function call();
// Geef de naam van de plugin als string terug
public function getName();
}
class Helper_Registry
{
protected $helpers = array();
public function register(Helper $helper)
{
$this->helpers[$helper->getName()] = $helper;
}
// Roep aan
public function call($name, $args = array())
{
if(isset($this->helpers[$name]))
return call_user_func_array(
array($this->helpers[$name], 'call'),
$args
);
throw new InvalidArgumentException(sprintf('Helper"%s" not found', $name));
}
// Magisch
// Ik vind het vaak mooier om magische functies als wrapper te gebruiken
// en er dus geen echte code in te zetten
public function __call($name, $args)
{
return $this->call($name, $args);
}
}
?>
Optie 2:
Geen interface voor de helpers
<?php
class Helper_Registry
{
// funcName => object
protected $helpers = array();
public function register($helper)
{
$reflection = new ReflectionObject($helper);
// Iterate alle publieke methoden
foreach($reflection->getMethods(ReflectionMethod::IS_PUBLIC) as $method)
$this->helpers[$method->name] = $helper;
}
// Roep aan
public function call($name, $args = array())
{
if(isset($this->helpers[$name]))
return call_user_func_array(
array($this->helpers[$name], $name),
$args
);
throw new InvalidArgumentException(sprintf('Helper "%s" not found', $name));
}
// Magisch
public function __call($name, $args)
{
return $this->call($name, $args);
}
}
?>
Gebruik:
<?php
// Optie 1:
class LinkHelper implements Helper
{
public function getName()
{
return 'linkhelper';
}
public function call($arg1, $arg2)
{
return $arg1.$arg2;
}
}
// Optie 2:
class LinkHelper
{
public function linkhelper($arg1, $arg2)
{
return $arg1.$arg2;
}
}
class View
{
/**
* @var Helper_Registry
*/
public $helpers;
public function indexView()
{
return $this->helpers->linkhelper($arg1, $arg2);
}
// EDIT ook leuk
public function __invoke($args)
{
$name = array_shift($args);
return $this->helpers->call($name, $args);
}
public function anotherView()
{
return $this('linkhelper', $arg1, $arg2);
}
}
$view = new View;
$view->helpers = new Helper_Registry;
$view->helpers->register(new LinkHelper);
echo $view->indexView();
?>
Ja?