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 エクステンションはそれを (ある程度) 達成することができまし://blog.felixdv.com/2008/01/09/spl_types-in-php-and-strong-typing/

4

2 に答える 2

2

弱いタイプの言語ではこれを行うことはできません。この変数を引数として取る関数がある場合は、PHPで型ヒントを使用できますが、それ以外の場合は、ユーザーが変数を再割り当てするのを防ぐことはできません。

これは、強く型付けされた言語にもある程度当てはまります。プログラマーがクラスの2つのインスタンスを作成する場合、それらが同じタイプの変数に異なるインスタンスを割り当てるのを防ぐメカニズムはありません。

これが発生する唯一の方法は、プログラマーが変数の代わりに定数を明示的に使用する場合(JavaやScalaなどで使用する場合など)ですが、いずれの場合も、どの言語でも定数を制御することはできません。finalval

于 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 に答える