PHP中的类名不区分大小写(使用one exception), 所以这应该不是问题。
可以使用静态方法访问类的主插件实例get_instance()
(example). 你不必为此构建一个单例。而且它不应该破坏向后兼容性。
如果旧代码中有公共方法,并且这些方法已被第三方代码使用,则必须保留准确的签名。因此,要么保留该方法并将调用传递给新类的实例,要么(如果有许多这样的方法)使用__call()
将所有这些方法集于一身。
(更新)以remove_action()
… 这很棘手。如果您现在从另一个类添加此回调,则没有安全的方法保持向后兼容,因为您无法“监视”remove_action()
呼叫
您可以注册旧回调并实现Observer 如果已移除,请注意。
我一直在为未来的项目考虑一个想法:将公共API与内部逻辑分离。
示例:创建类Plugin_API
并在设置时将工作代码中的所有对象传递到该类中。调用该API中的方法时,在内部将该调用传递给负责的对象,而不向公众公开插件结构。
示例代码
add_action( \'wp_loaded\', array ( Plugin_Controller::get_instance(), \'plugin_setup\' ) );
class Plugin_Controller
{
protected static $instance = NULL;
public static function get_instance()
{
NULL === self::$instance and self::$instance = new self;
return self::$instance;
}
public function plugin_setup()
{
$api = Plugin_API::get_instance();
$api->add_object( \'post_type\', new Plugin_Custom_Post_Type );
$api->add_object( \'taxonomy\', new Plugin_Custom_Taxonomy );
$api->add_object( \'options_page\', new Plugin_Options_Page );
add_action( \'wp_head\', array ( $api, \'wp_head\' ) );
}
}
class Plugin_Custom_Post_Type {}
class Plugin_Custom_Taxonomy {}
class Plugin_Options_Page {}
class Plugin_API
{
protected static $instance = NULL;
protected $objects;
public static function get_instance()
{
NULL === self::$instance and self::$instance = new self;
return self::$instance;
}
public function add_object( $name, $object )
{
$this->objects[ $name ] = $object;
}
public function wp_head()
{
$this->objects[\'post_type\']->wp_head_callback();
$this->objects[\'taxonomy\']->wp_head_callback();
}
}
现在,另一个插件可以删除该操作…
remove_action( \'wp_head\', array ( Plugin_API::get_instance(), \'wp_head\' ) );
…您仍然可以随时更改插件结构。
这只是一个想法,我没有用过。但对于一个包含大量类的复杂插件来说,值得一试。不确定它将如何与过滤器一起工作,但无论如何,这些都更容易移动。
更新数量未知的post元字段可能会很昂贵。我不会碰那个。