开发者

PHP extended class event

开发者 https://www.devze.com 2023-01-23 10:51 出处:网络
Here\'s the code I\'ll be talking on (keep this in mind throughout this post): File: index.php /** * Base class used when created a new application.

Here's the code I'll be talking on (keep this in mind throughout this post):

File: index.php

/**
 * Base class used when created a new application.
 */
class App {
     public function do_something(){
     }
}

/**
 * Class used, among other things, to manage all apps.
 */
class Apps {
    开发者_JAVA技巧public static function _init(){
        foreach(glob('apps/*') as $dir)
            if(file_exists($dir.'/index.php')
                include_once($dir.'/index.php');
    }
}
Apps::_init();

File: MyApp/index.php

class MyApp extends App {
     /**
      * This function overrides the the one in App...
      */
     public function do_something(){
     }
}

So, you probably know what I'm doing; it's an application/extension system, were an application is kept in a separate folder in /apps/ and it's entry point is index.php.

The code, so far, works nicely (or, well it should, I wrote it off the top of my head ;)). Anyway, my issue is to make Apps class aware of all the extended App classes.


The easy way would be to write something like the following at the end of each application's index.php.

Apps::register('MyApp'); // for MyApp application

The problem with it is that although it's understandable, it is not automated. For instance, copy+pasting an application needs that modification, and new developers are more likely to completely forget that code (and even worse, most of the code still works without it!).

Another idea was to use this code after the code in _init():

$apps=array();
foreach(get_declared_classes() as $class)
    if(array_search('App',class_parents($class))!==false)
        $apps[]=$class;

But it sounds too resource-intensive that last one.

What do you think?


The register approach is okay, you could do

Apps::register(get_class());

inside the MyApp constructor, if you have one.


The register approach looks clean and simple. It will be clear to later maintainers (and to yourself) what the code does and it's less error-prone.

0

精彩评论

暂无评论...
验证码 换一张
取 消