魔术方法创建全局变量而不污染全局空间的最简单方法是利用Singleton
图案Essential仅实例化一次并通过单个静态函数访问的类。
在这种情况下,你可以getters
和setters
存储和检索值,但我们可以利用PHP的神奇方法。现在,您可以从任何地方访问该类(只要已加载),并使用任何值保存任何属性。
基本语法是<class>::<singleton>()-><property>
在访问这个类之前,只需加载它一次。
if ( ! class_exists( \'CustomSettingClass\' ) ) {
class CustomSettingClass {
private $s = array ();
private static $_instance;
public static function instance() {
if ( ! static::$_instance ) {
static::$_instance = new self();
}
return static::$_instance;
}
// setter
function __set( $k, $c ) {
$this->s[ $k ] = $c;
}
// getter
function __get( $k ) {
return isset( $this->s[ $k ] ) ? $this->s[ $k ] : null;
}
// callable
function __call( $method, $args ) {
if ( isset( $this->s[ $method ] ) && is_callable( $this->s[ $method ] ) ) {
return call_user_func_array( $this->s[ $method ], $args );
} else {
echo "unknown method " . $method;
return false;
}
}
}
}
然后只需访问
singleton
来自
static
访问者。
CustomSettingClass::instance()->foo = \'bar\';
echo CustomSettingClass::instance()->foo; // bar
CustomSettingClass::instance()->complex = array(1,2,3);
print_r( CustomSettingClass::instance()->complex ); // 1,2,3
至于安全性,您可以使用相同的方法
magic methods
对安全函数使用私有方法。基本的OOP真的。
还值得注意的是,通过添加__call
神奇的方法,我们可以解析匿名函数。
// create handler
CustomSettingClass::instance()->callback = function($value){ echo $value; };
// add listener
add_action( \'test\', array(CustomSettingClass::instance(), \'callback\'));
// do action
do_action (\'test\', \'some value\'); // some value
现在,您有了一个完全动态且可自定义的对象,其行为就像
$global
, 可随时调整,并可处理
actions
和
filters
.
简化了静态类函数,所以神奇的方法是过度杀戮而非私有的。那么,一个具有私有内部结构和面向外部的设置getter的静态类怎么样。你只需要在公众面前尽可能多地曝光StaticSettings::settings()
作用
if ( ! class_exists( \'StaticSettings\' ) ) {
class StaticSettings {
private static $_location = \'here\';
public static function settings() {
return array (
\'some\' => \'settings\',
\'go\' => static::$_location,
);
}
}
}
$settings = StaticSettings::settings();
我想说的是,最好的选择是在函数路径中使用静态变量。这实例化了
$settings
对象为
null
可以触发初始化。在这一点上,它们基本上是缓存的。因此,对该函数的每一次调用都会返回一个已构造的对象。所有内部工作对函数本身都是私有的。
function my_settings() {
static $settings = null;
if ( null === $settings ) {
// initialize settings object once
$settings = array (
\'some\' => \'setting\',
\'go\' => \'here\',
);
}
// return cached value
return $settings;
}