我需要一个变量,只有一个函数可以写(让我们调用函数a),只有一个,其他函数可以读取(让我们调用函数b)。这有可能吗?
发布于 2010-09-14 11:18:44
你可以用静态变量
function foo($val=null) {
static $var = null;
if (!is_null($var)) $var = $val;
return $val;
}在这里,$var仅在函数foo中可见,并在多个调用中得到维护:
foo(123);
echo foo(); // 123
foo(456);
echo foo(); // 456或者使用带有私人成员的类并使用公共方法访问/修改它:
class A {
private $var;
public function setVar($val) {
$this->var = $val;
}
public function getVar() {
return $this->var;
}
}使用此方法,私有成员var仅对该类的特定实例可见:
$obj1 = new A();
$obj1->setVar(123);
$obj2 = new A();
$obj2->setVar(456);
echo $obj1->getVar(); // 123
echo $obj2->getVar(); // 456如果您将成员设置为静态,那么只有一个用于类,而不是针对每个实例:
class A {
private static $var;
public function setVar($val) {
self::$var = $val;
}
public function getVar() {
return self::$var;
}
}
$obj1 = new A();
$obj1->setVar(123);
$obj2 = new A();
$obj2->setVar(456);
echo $obj1->getVar(); // 456
echo $obj2->getVar(); // 456发布于 2010-09-14 11:42:12
您可以使用静态抽象类。
abstract class Settings
{
private static var $_settings = array();
public static function get($key,$default = false)
{
return isset(self::$_settings[$key]) ? self::$_settings[$key] : $default;
}
public static function set($key,$value)
{
self::$_settings[$key] = $value;
}
}示例用法:
Settings::set('SiteName',`SomeResult`);
echo Settings::get('SiteName');发布于 2010-09-14 11:53:05
从5.3.0开始,您可以使用匿名函数作为闭包。这里的优势是,你可以抓住b.这是由a.等你准备好了就开枪:
<?php
function a()
{
// Only a() can write to $myVar
$myVar = 42;
$b = function() use ($myVar)
{
// $b can read $myVar
// no one else can
return $myVar;
};
return $b;
}
// get $b
$test = a();
// use $b
echo $test();
?>5.3.0之前的另一种解决方案,但这里a必须触发b,这可能不太实际:
您可以简单地创建一个内部变量并将其作为参数传递。您可以在类中完成此操作,也可以在简单函数中这样做:
function a()
{
// ...
// Write the variable that
// only this function can write to
$thisVar = 1;
b($thisVar);
//...
}
function b($myVar)
{
// ...
// Do stuff w $myVar, a copy of $thisVar
// Changing $myVar has no effect on $thisVar
//
}https://stackoverflow.com/questions/3708311
复制相似问题