【发布时间】:2014-02-28 17:05:21
【问题描述】:
如何在不创建新实例的情况下从外部访问类变量 PHP ?像这样的:
class foo
{
public $bar;
}
echo foo::$bar;
是否有可能或者我必须创建将打印或返回此值并使用它或创建新实例($a = new foo; echo $a->$bar)的方法?
编辑:我不想创建稍后会更改的常量但经典变量。
【问题讨论】:
如何在不创建新实例的情况下从外部访问类变量 PHP ?像这样的:
class foo
{
public $bar;
}
echo foo::$bar;
是否有可能或者我必须创建将打印或返回此值并使用它或创建新实例($a = new foo; echo $a->$bar)的方法?
编辑:我不想创建稍后会更改的常量但经典变量。
【问题讨论】:
将此变量设为静态以在没有类对象的情况下访问它。
如果你想通过方法改变静态变量的值,那么你需要使用静态方法
你可以这样试试:
class foo
{
public static $bar ="google";
public static function changeVal($val){
self::$bar=$val;
}
}
foo::changeVal("changed :)");
echo foo::$bar;
输出:changed :)
你也可以这样改,不用静态方法:
foo::$bar = "changed";
像这样:
class foo
{
public static $bar ="google";
}
echo foo::$bar;
输出:google
【讨论】:
如果使用静态变量是有意义的:
class foo{
public static $bar = 'example';
}
可以这样访问:
echo foo::$bar;
【讨论】:
如果值在运行时永远不会改变,那么您可能需要一个类常量 (http://www.php.net/oop5.constants)
class foo {
const bar = 'abc';
}
...否则您需要一个公共静态变量 (http://www.php.net/manual/en/language.oop5.static.php)
class foo {
public static $bar = 'abc';
}
...不管怎样,像这样访问它
echo foo::bar;
【讨论】:
只有当变量标记为静态时,才能访问类变量而不创建实例:
class foo
{
public static $bar;
}
【讨论】:
这是你使用类变量的方式:
// with instantiation
class foo {
// initialize on declare
public $bar = 1;
// or initialize in __construct()
public function __construct(){
$this->bar = 1;
}
}
$foo = new foo();
var_dump($foo->bar);
// static way
class static_foo {
public static $bar = 1;
}
var_dump(static_foo::$bar);
这就是你如何从一个随机的类名字符串变量实例化一个类。
$foo = new foo();
$random_class_name = $foo->bar;
try {
// following line throws if class is not found
$rc = new \ReflectionClass($random_class_name);
$obj = $rc->newInstance();
// can be used with dynamic arguments
// $obj = $rc->newInstance(...);
// $obj = $rc->newInstanceArgs(array(...));
} catch(\Exception $Ex){
$obj = null;
}
if($obj){
// you have a dynamic object
}
您的实际问题是什么?
【讨论】: