我正在构建一个包含许多输入验证的类,我决定将它们放在__set方法中(我不确定这是否是正确的形式,因为我有有限的OOP经验).这似乎工作正常,当从类外部传递无效值时抛出正确的错误.但是,如果在类中修改了变量,则__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/>";
}
Run Code Online (Sandbox Code Playgroud)
在文档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");
}
...
}
Run Code Online (Sandbox Code Playgroud)