0
 class Foo 
{
    public $var ;

    function __construct($value) 
    {
         $this->var = $value ;
    }
}
$myFoo = new Foo('hello');
echo $myFoo->var . '<br>' ; // output : hello
// Question : how  can I prevent another programer from accidentaly doing the following
$myFoo = 4 ;
echo $myFoo ; // output : 4

我的问题在评论中//问题:...

我希望我的同事能够将值分配给 $myFoo 仅使用 $myFoo->var (或类 Foo 中可用的任何公共突变体)

谢谢你

编辑: 对于声称不可能的用户,SPL_Types PECL 扩展能够(在一定程度上)实现这一点,例如http://php.net/manual/en/class.splint.phphttp ://blog.felixdv.com/2008/01/09/spl_types-in-php-and-strong-typing/

4

2 回答 2

2

你不能用任何弱类型语言来做到这一点。如果你有将这个变量作为参数的函数,你可以在 PHP 中使用类型提示,否则你不能阻止人们重新分配他们的变量。

即使对于强类型语言也是如此。如果程序员创建了一个类的两个实例,则没有机制可以阻止他们将不同的实例分配给相同类型的变量。

发生这种情况的唯一方法是程序员显式使用常量而不是变量(例如final在 Java 或valScala 中使用类似的东西),但是,无论哪种方式,您都无法在任何语言中控制它。

于 2012-12-16T21:56:47.170 回答
0

您无法阻止更改类中的类型,但如果您将其设为受保护或私有,然后添加 setVariable() 方法(其中 Variable 是您的变量名),您可以控制输入。就像是:

class myClass {
    protected $integer = 0;
    public function setInteger($new_value)
    {
        if (!is_int($new_value)) {
             throw new RuntimeException('Cannot assign non-integer value to myClass::$integer');
        }
        $this->integer = $new_value;
    }
    public function getInteger()
    {
        return $this->integer;
    }
}

// Now, outside of the class, the $integer property can only be changed using setInteger()
$class = new myClass;
$class->setInteger('dog'); // Uncaught Runtime exception ...
$class->setInteger(5);
echo $class->getInteger(); // 5

该函数的另一个版本将接受字符串数字并将它们转换为整数:

    public function setInteger($new_value)
    {
        if (!is_numeric($new_value)) {
             throw new RuntimeException('Cannot assign non-integer value to myClass::$integer');
        }
        $this->integer = (int) $new_value;
    }
$class->setInteger('5'); // 5
于 2012-12-16T22:32:52.077 回答