PHP игнорирует метод __set внутри класса - PullRequest
6 голосов
/ 28 апреля 2009

Я строю класс с несколькими входными проверками и решил поместить их в метод __set (я не уверен, что это правильная форма, поскольку у меня ограниченный опыт ООП) Кажется, это работает нормально, выдавая правильные ошибки, когда недопустимые значения передаются извне класса. Однако, если переменная изменяется внутри класса, метод _ _set, похоже, полностью игнорируется.

Любое понимание будет очень цениться

//RESULT:::::::::::::::::::::::::::::::
// PASS: Testing : hello
// PASS: Testing exception handling
// __SET: Setting b to 123
// PASS: Testing with valid value: 123
// FAIL: Testing exception handling World2



 <?php
class Test {
        public $a;
        private $b;

        function __set( $key, $val ) {

                switch( $key ) {
                        case 'b':
                                if( !is_numeric( $val ) ) throw new Exception("Variable $b must be numeric");
                                break;
                }

                echo ( "__SET: Setting {$key} to {$val}<br/>" );
                $this->$key = $val;
        }
        function __get( $key ) { return $this->$key; }
        function bMethod() {
                $this->b = "World2";
        }

}

$t = new Test();

//testing a
try {
        $t->a = "hello";
        echo "PASS: Testing $a: {$t->a}<br/>";
} catch( Exception $e)  {
        echo "FAIL: Testing $a";
}

//testing b
try {
        $t->b = "world";       
        echo "FAIL: Testing $b exception handling<br/>";
} catch( Exception $e ){
        echo "PASS: Testing $b exception handling<br/>";
}

//testing b with valid value
try  {
        $t->b = 123;
        echo "PASS: Testing $b with valid value: {$t->b}<br/>";
} catch( Exception $e) {
        echo "FAIL: Testing $b";
}

//bypassing exception handling with method
try {
        $t->bMethod("world");
        echo "FAIL: Testing $b exception handling {$t->b}<br/>";
} catch( Exception $e ) {
        echo "PASS: Testing $b exception handling<br/>";
}

Ответы [ 2 ]

10 голосов
/ 28 апреля 2009

Прочитайте определение __set: «__set () запускается при записи данных в недоступные элементы». Ключевым здесь является недоступность. Внутри класса все члены доступны, и __set обойден. Перегрузка

6 голосов
/ 28 апреля 2009

Документация в php документации гласит:

__ get () используется для чтения данных из недоступных членов.

Итак, вы можете сделать что-то вроде:

<?php
class Test {
    private $_params = array();

    function __set( $key, $val ) {
        ...
        $this->_params[$key] = $val;
    }

    function __get( $key ) {
        if (isset($this->_params[$key])) return $this->$key;
        throw Exception("Variable not set");
    }

    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...