首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >限制变量访问

问限制变量访问
EN

Stack Overflow用户
提问于 2010-09-14 11:12:56
回答 4查看 230关注 0票数 3

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-09-14 11:18:44

你可以用静态变量

代码语言:javascript
复制
function foo($val=null) {
    static $var = null;
    if (!is_null($var)) $var = $val;
    return $val;
}

在这里,$var仅在函数foo中可见,并在多个调用中得到维护:

代码语言:javascript
复制
foo(123);
echo foo();  // 123
foo(456);
echo foo();  // 456

或者使用带有私人成员的类并使用公共方法访问/修改它:

代码语言:javascript
复制
class A {
    private $var;
    public function setVar($val) {
        $this->var = $val;
    }
    public function getVar() {
        return $this->var;
    }
}

使用此方法,私有成员var仅对该类的特定实例可见:

代码语言:javascript
复制
$obj1 = new A();
$obj1->setVar(123);
$obj2 = new A();
$obj2->setVar(456);
echo $obj1->getVar();  // 123
echo $obj2->getVar();  // 456

如果您将成员设置为静态,那么只有一个用于类,而不是针对每个实例:

代码语言:javascript
复制
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
票数 6
EN

Stack Overflow用户

发布于 2010-09-14 11:42:12

您可以使用静态抽象类。

代码语言:javascript
复制
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;
    }
}

示例用法:

代码语言:javascript
复制
Settings::set('SiteName',`SomeResult`);

echo Settings::get('SiteName');
票数 1
EN

Stack Overflow用户

发布于 2010-09-14 11:53:05

从5.3.0开始,您可以使用匿名函数作为闭包。这里的优势是,你可以抓住b.这是由a.等你准备好了就开枪:

代码语言:javascript
复制
<?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,这可能不太实际:

您可以简单地创建一个内部变量并将其作为参数传递。您可以在类中完成此操作,也可以在简单函数中这样做:

代码语言:javascript
复制
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
    //
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3708311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档