On Thu, Mar 1, 2012 at 4:36 AM, Lazare Inepologlou <linep...@gmail.com>wrote:
> And, *what if PHP added the following aliases for the hint scalar*: > > - bool > > - int > > - float > > - string >> > > If an object has a __toString method, does it qualify as a valid value to > be passed to a scalar argument? In my opinion, it should. > > Your suggestion has a future compatibility problem. The introduction of > new type casting methods (like __toInt or like __castTo) is an open > possibility. In such a case, if those keywords are nothing but aliases for > "scalar", then there will be no way to choose which type casting method > should be chosen. > > > Lazare INEPOLOGLOU > Ingénieur Logiciel > You raise interesting points, Lazare, but I don't believe the compatibility issues you're concerned about are valid. Failing fast, similar to the Poka-Yoke principal in manufacturing, suggests that system failure should occur as soon as possible to reduce software bugs: http://www.martinfowler.com/ieeeSoftware/failFast.pdf Consider the following example: // example class that does not implement __toString() class test{ } function foo($arg1, $arg2, $arg3){ if ($arg1) { return "The answer is: " . $arg1; } if ($arg2) { return "The answer is: " . $arg2; } if ($arg3) { return "The answer is: " . $arg3; } } $test = new test(); echo foo($arg1 = "string", $arg2 = 100, $arg3 = $test); // echos The answer is: string echo foo($arg1 = false, $arg2 = 100, $arg3 = $test); // echos The answer is: 100 echo foo($arg1 = false, $arg2 = false, $arg3 = $test); // catchable fatal error A developer using this function would only see this issue some of the time, as this code fails late WITHIN some branches of the function, and the bug is harder to identify. We can do better, though. If the scalar type hint were applied, users would merely have to cast the object to a string ON ENTRY to the function (and, of note, this would work for your __toInt and __castTo concerns): echo foo($arg1 = "string", $arg2 = 100, $arg3 = (string)$test); // catchable fatal error Because the cast is performed on entry to the call, the bug shows up immediately. I would argue that this code is clean (the cast to string in the foo() call is a small amount of noise/keystrokes), visibly conformant to the intentions of the foo() function, and more likely to catch bugs early on in the process. Adam