2012-12-16 39 views
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 

我的问题是在评论//问:...防止PHP对象从自动浇注

我想我的同事能够赋值给$ myFoo只使用$ myFoo-> VAR (或任何公共存取器是在类Foo可用)

谢谢

编辑: 所有关于谁声称这是不可能的用户,SPL_Types PECL extention是能够做到这一点(以一定程度上请参阅例如http://php.net/manual/en/class.splint.phphttp://blog.felixdv.com/2008/01/09/spl_types-in-php-and-strong-typing/

+3

你不能,但是当你需要使用它,你可以检查变量类型并抛出一个异常/错误,如果它不是你所期望的。 你是不是真的在你的榜样重铸,你分配一个新的值给一个变量。 – datasage

+0

你不能这样做。只有在使用'='运算符时才能完成。 –

+0

您可以编写自己的IDE,也可以确保与聪明人一起工作。 – moonwave99

回答

2

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

这是真实的。即使是强类型语言的程度。如果一个程序员创建了一个类的两个实例,那么就没有机制来阻止他们将一个不同的实例分配给一个相同类型的变量。

会发生这种情况的唯一方法是,如果程序员明确地使用常数而不是变量(如使用像final在Java中,或在斯卡拉val,等等),但是,无论哪种方式,你有没有用任何语言来控制它。

+0

我接受这个答案,因为它提供了一个相当实用的解决方案,在大量的谷歌搜索之后,更正确的答案在我看来是写我自己的扩展,但那会很好......不太实用:-)谢谢 – exTrace101

+0

@ exTrace101 , 确实。这是语言提供的。如果你想改变语言使其成为不同的语言,你可以为此写一个扩展名。 – rid

0

你不能阻止类内变化的类型,但如果你把它保护或私有,然后添加一个setVariable()方法(其中变量是你的变量名),你可以控制输入。喜欢的东西:

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 
+0

如果您添加$ class ='hello';在$ class-> setInteger();之后您的$ class对象突然变为字符串 – exTrace101

+0

@ exTrace101,对于所有弱类型的语言都是如此。 IDE可能会警告您,但语言不会。事实上,您可以将任何值重新分配给变量,这是弱类型语言的一个特性,正好相反,它是强类型语言的一个特性。实验性的SPL_Types扩展为PHP增加了一些强大的打字功能,这是一种弱类型语言。 – rid

+0

@ exTrace101这是PHP,它不是针对强类型的 – imkingdavid