Buduję klasę z wieloma walidacjami wejściowymi, i zdecydowałem się umieścić je w metodzie __set (nie jestem pewien, czy to jest odpowiednia forma, ponieważ mam ograniczone Doświadczenie OOP). Wydaje się, że działa dobrze, rzucając prawidłowe błędy, gdy nieprawidłowe wartości są przekazywane spoza klasy. Jeśli jednak zmienna zostanie zmodyfikowana w klasie, metoda __set wydaje się być całkowicie ignorowana.Ignorowanie PHP metoda __set w klasie
Każdy wgląd byłby znacząco doceniane
//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/>";
}
ten miał mnie foxed przez co najmniej godzinę ... – Jonathan