Apparently, and this is a truly old bogus I opened ages ago, the solution was to supress Strict errors (lol, thanks developers) even if in every other programming language, via overload, this kind of situation could be solved in a bit.
How to solve the problem?
While last post I suggested a couple of runtime solutions, this time I suggest to simply avoid the method definition and use a different one with a meaningful name. In this example I created a String class:
class String {
// choose a recognizable name for protected method
static protected function _concat(array $arguments){
return new self(implode('', $arguments));
}
// use magic __callStatic function
static public function __callStatic($name, array $arguments){
// check the recognizable name
switch($name = '_'.$name){
case '_concat':
// return its call
return self::$name($arguments);
}
}
protected $__value__; // save the string somewhere
// assign initial string, if any
public function __construct($__value__ = ''){
$this->__value__ = $__value__;
}
// use magic __call method
public function __call($name, array $arguments){
// check the recognizable name
switch($name = '_'.$name){
case '_concat':
// normalize expected arguments
array_unshift($arguments, $this->__value__);
// return its call
return self::$name($arguments);
}
}
// this is a String class ...
public function __toString(){
return $this->__value__;
}
}
// test the alchemy
$str = new String('Hello');
var_dump(
String::concat('Hello', ' ', 'World', '!') == $str->concat(' ', 'World', '!')
// true, both are Hello World!
);
As we can see, errors are gone and the code is much easier to maintain. Hope this will help (performances? ... oh, come on!)
No comments:
Post a Comment