我需要一个只有一个函数可以编写的变量(让我们调用该函数a
)并且只有一个其他函数可以读取(让我们调用该函数b
)。这可能吗?
答案 0 :(得分:6)
您可以使用static variable:
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
或者使用带有private member的类,并使用公共方法访问/修改它:
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
如果您创建了成员static,那么该类只有一个而不是每个实例:
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
答案 1 :(得分:1)
您可以使用静态抽象类。
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');
答案 2 :(得分:1)
自5.3.0起,您可以使用 anonymous functions as closures 。这里的优势在于你可以坚持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
//
}
答案 3 :(得分:1)
你的意思是friend functions吗?因为我很想能够做到这一点。到目前为止,我还没有找到一个简单的方法(虽然你可以尝试使用Reflection,但这似乎是很省力的方式)。
对我来说,它通常不是维护数据完整性/封装的问题,而是保持公共方法列表(有点像类的API)没有混乱。一个完美的框架应该易于使用,具有明显的功能名称等等。打算用于其他方法的方法确实搞砸了。我采用的“解决方案”是将这些函数名称加上一个或两个下划线,并在评论中写入“仅供内部使用”或某种程度的内容。