Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Functies in een class registreren.

Pagina: 1
Acties:

Onderwerpen


  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 19-10 22:50
Hallo Tweakers,

Bestaat er een mogelijkheid om een functie in een class te zetten. Ik heb een stukje voorbeeld code geschreven om te laten zien wat ik precies bedoel:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<################################################################################################################# 

    // './addons/image.php' 
    class plugin_images{ 
        public function plugin_showimage($image){ 
            return '<img src="'.$image.'" alt="Test" />'; 
        } 
    } 
     
    // './addons/youtube.php' 
    class plugin_youtube{ 
        public function plugin_youtube($vid){ 
            return '<iframe title="YouTube video player" width="480" height="390" src="http://www.youtube.com/embed/'.$vid.'" frameborder="0" allowfullscreen></iframe>'; 
        } 
    } 
     
################################################################################################################# 
     
    // './application.class.php' 
    class clsApplication{ 
         
        public function __construct(){ 
            echo 'Application initialized.<br />'; 
        } 
         
    } 

################################################################################################################# 
     
    // './index.php' 
    $application = new clsApplication(); 
     
    // De lijn hieronder wil ik werkend zien te krijgen. Dus de class 'plugin_images' moet worden geimplanteerd in clsApplication. 
    // $application->plugin_showimage('http://www.google.nl/images/logos/ps_logo2a_cp.png'); 
    // $application->plugin_youtube('D6mtiaL30vk'); 
     
################################################################################################################# 

[ Voor 11% gewijzigd door xehbit op 28-02-2011 20:36 ]


  • G70boX
  • Registratie: Juli 2004
  • Laatst online: 20:59
Heb je zelf op Google al gezocht? Er zijn zat tips te vinden.

http://www.gen-x-design.c...functions-to-php-classes/ plus de comments moet je wel op weg helpen.

[ Voor 15% gewijzigd door G70boX op 28-02-2011 20:51 ]


  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 19-10 22:50
G70boX schreef op maandag 28 februari 2011 @ 20:48:
Heb je zelf op Google al gezocht? Er zijn zat tips te vinden.

http://www.gen-x-design.c...functions-to-php-classes/ plus de comments moet je wel op weg helpen.
Ja dat had ik ook al gevonden. Maar dan zou ik class plugin_images extends clsApplication moeten gebruiken. En plugin_images moeten laden. Maar ik zou willen dan ik clsApplication laad. En de classes plugin_* zichzelf toevoegen in de classes.

  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 10-10 08:02
hint : spl autoload

Driving a cadillac in a fool's parade.


  • storeman
  • Registratie: April 2004
  • Laatst online: 19:46
Wat je hier suggereert is niet mogelijk en is ook niet logisch. Je zou een plugin loader moeten maken welke elke plugin aanroept.

Je zou eens naar de bouw van het Zend Framework moeten kijken, deze hebben dat zeer goed (tot in den treure) uitgewerkt.

Als je een bepaalde naamgeving hanteert, dan kun je eenvoudig die klassen laden. Dit zou je ook kunnen gebruiken met de magic methods zoals __call().

"Chaos kan niet uit de hand lopen"


  • MueR
  • Registratie: Januari 2004
  • Laatst online: 12:11

MueR

Admin Devschuur® & Discord

is niet lief

Het idee van classes is dat je redelijk gesloten stukken code maakt, waarbij niet zomaar at random meuk in de duwen is. Dat bestaat namelijk al in gewone functies. Je zult dus met hierboven genoemde methoden moeten werken.

Anyone who gets in between me and my morning coffee should be insecure.


  • FragFrog
  • Registratie: September 2001
  • Laatst online: 16:27
storeman schreef op maandag 28 februari 2011 @ 21:07:
Wat je hier suggereert is niet mogelijk
Effectief wel natuurlijk:
Dit zou je ook kunnen gebruiken met de magic methods zoals __call().
Met __call kun je prima plugins verwerken op de manier die jij wilt. Dan doe je iets als:

PHP:
1
2
3
4
5
6
7
8
9
10
class Foo
{
    public function __call ($method, $params) 
    {
        if (!class_exists($method))
            return false;

        return new $method($params);
    }
}


Vervolgens autoloading gebruiken om plugins te laden en je bent er al. Zit je natuurlijk wel vast aan naming conventions en het nut is wat twijfelachtig, maar het kan op zich prima, en mits goed uitgewerkt ook nuttig zijn.
MueR schreef op maandag 28 februari 2011 @ 21:24:
waarbij niet zomaar at random meuk in de duwen is
Dat kan met PHP dus nou net wel, net zoals wel meer leuke geintjes die je in andere talen mist ;)

[ Voor 35% gewijzigd door FragFrog op 01-03-2011 00:24 ]

[ Site ] [ twitch ] [ jijbuis ]


Verwijderd

Met __call kun je inderdaad allerlei leuke geintjes uithalen, maar je zou eventueel ook als een soort dependency injection kunnen doen door iets te doen in de lijn van :

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<?php
class Application
{
 protected $_plugins= array();
 public function __construct()
 {
   $this->loadPlugins();
 }

 public function registerPlugin($plugin)
 {
    $name = $plugin->getName();

    $plugin->setApplication($this);
    $this->_plugins[$name] = $plugin;
    
 }

 function invokePlugin($name, $param = array())
 {
   if( isset($this->_plugins[$name]))
   {
      $plugin = $this->_plugins[$name];
      call_user_func_array( array($plugin, $name), $param);
      return true;
   }
   else
   {
     // exception throwen ofzo 
   }
   return false;
 }

 public function loadPlugins()
 {
   /*
   * plugin files zoeken, inladen en initieeren en via de registerPlugin method registreren. 
   * 
   */

 }

 function __call($name, $param)
 {
   // eventueel de invokePlugin methode implementeren
 }

}


class ApplicationPlugin
{
  protected $_application;

 function __construct()
 {
 }

 function setApplication($application)
 {
   $this->_applícation = $application;
 }

}


Je zou ook eventueel een soort Hook systeem kunnen maken waarbij je het omdraait, dat een plugin een eigen method registreerd als een soort event.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
class ApplicationHook
{
    static protected $_hooks = array();

    static function registerHook($hook, $callback)
    {
        self::$_hooks[$hook][] = $callback;
    }

    static function hookInvoke($hook)
    {
        $param = func_get_args();
        array_shift($param);
        
        if(isset(self::$_hooks[$hook]))
        {
            $hooks = self::$_hooks[$hook];
            foreach($hooks as $callback)
            {
             call_user_func_array($callback, $param);
            }
        }
    }
}

class AppPlugin
{
    function  __construct()
    {
     ApplicationHook::registerHook('application_on_render', array($this, 'onRender'));
    }

    function onRender()
    {
        echo 'the application has rendered';
    }
}

$plugin = new AppPlugin();

ApplicationHook::hookInvoke('application_on_render');


Bij de laatste methode kun je zelf een soort event definieren waar je plugins, of eigenlijk ieder ander object , op kunnen reageren.
Pagina: 1