限制变量访问

时间:2010-09-14 11:12:57

标签: php variables function

我需要一个只有一个函数可以编写的变量(让我们调用该函数a)并且只有一个其他函数可以读取(让我们调用该函数b)。这可能吗?

4 个答案:

答案 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)没有混乱。一个完美的框架应该易于使用,具有明显的功能名称等等。打算用于其他方法的方法确实搞砸了。我采用的“解决方案”是将这些函数名称加上一个或两个下划线,并在评论中写入“仅供内部使用”或某种程度的内容。