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)
Спасибо
EDIT: при всем уважении к пользователям, которые утверждают, что это невозможно, SPL_Types Расширение PECL удалось достичь (в определенной степени), например, http://php.net/manual/en/class.splint.php или http : //blog.felixdv.com/2008/01/09/spl_types-in-php-and-strong-typing/
Вы не можете сделать это на любом слабо типизированном языке. Если у вас есть функции, которые принимают эту переменную в качестве аргумента, вы можете использовать намеки типа в PHP, но в противном случае вы не сможете помешать людям переустанавливать свои переменные.
Это верно даже для строго типизированных языков. Если программист создает два экземпляра класса, не существует механизма, позволяющего им назначать другой экземпляр переменной того же типа.
Единственный способ, который может произойти, – это то, что программист явно использует константы вместо переменных (например, используя такие вещи, как final
в Java, или val
в Scala и т. Д.), Но в любом случае вы не можете контролировать его на любом языке.
Вы не можете запретить изменение типа внутри класса, но если вы сделаете его защищенным или приватным, а затем добавите метод 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