On Sep 20, 2011 2:10 AM, <de...@lucato.it> wrote: > > Hi! > > I followed the whole discussion, still it is not clear which one is > considered good and which bad practice... > > In ZF 1 and 2, ZendRegistry::__construct() has the following signature with > 2 parameters: > > function __construct($array = array(), $flags = parent::ARRAY_AS_PROPS) > > while SPL ArrayObject (its parent) has this one with 3 parameters: > > ArrayObject::__construct() ([ mixed $input [, int $flags [, string > $iterator_class]]] ) > > from > https://github.com/zendframework/zf2/blob/master/library/Zend/Registry.phpand > http://www.php.net/manual/en/arrayobject.construct.php >
That's exactly why I think constructors should be exempted from "strict" signature checking. When you pass objects as a function parameter, the signature should match even though you pass an instance of a child class. That has been well established in some of the previous messages. However, I don't think this should apply to constructors in the same way. They can be 'simplified' as the child class becomes more specific. > There are other similar examples, e.g. > > ReflectionClass::getParentClass() > and > ZF Zend_Reflection_Class::getParentClass($reflectionClass = > 'Zend_Reflection_Class') > > I don't know if being ArrayObject an SPL makes any difference, I hope > not... Is the example relevant for the discussion ? > > I always found PHP flexibility one of its strong points, and since we don't > have method overloading, limiting the signature extension or contraction > doesn't sound very useful to developers. > > bye! > Devis > > > On 19 September 2011 16:53, Ferenc Kovacs <tyr...@gmail.com> wrote: > > > First of all, Anthony, thanks for joining into the discussion! > > > > >> With respect to the func_get_args argument, I see that as a non-issue. > > >> Sure, you can do it. But if you do, you're lying about the > > >> interface. You're telling the callers that you expect no arguments, > > >> but then all of a sudden you error out. > > > > > > > > > Well, we have no way of declaring that we accept an undefined number of > > > arguments. So there is simply no choice here. > > > > maybe we should consider adding support for that, as I agree that it > > would make the contract more clear. > > > > >> You're pushing all of the > > >> interface declaration logic out of the interface and into code. > > >> That's only going to create maintainability, readability and quality > > >> issues as time goes on. Realistically, the only good use of > > >> func_get_args is when you need to take in an unlimited number of > > >> arguments. But if you do that, you should include the minimum number > > >> in the API itself. So if you have a function add() that can take any > > >> number of integers, the minimum that makes sense is 2. So you should > > >> declare add($left, $right), and then use func_get_args to get all of > > >> them to add together. However, with that said, I'd argue that it's > > >> bad design to do that at all. I'd recommend instead taking an array > > >> parameter and adding the elements of the array. Not only is it > > >> cleaner and easier to understand, it also solves the problem of > > >> extending that functionality (so you're not duplicating the > > >> func_get_args in each child)... > > >> > > > > > > By doing that, you also do exactly what you describe earlier, you push > > the > > > args checks in the code itself, as you could always pass an incomplete > > > array, and you could error out earlier. > > > > > > Var-args functions have been quite used for many things, there is no > > reason > > > why we should flag that as bad practice now... is there? > > > > > > > not that I know of, except that we have no explicit way to declare > > signature. > > > > to reflect to the original points by Anthony: > > bringing up the Square - Rectangle example was a bad one, but to quote > > from the wikipedia entry: "Violations of LSP, like this one, may or > > may not be a problem in practice, depending on the postconditions or > > invariants that are actually expected by the code that uses classes > > violating LSP. Mutability is a key issue here. If Square and Rectangle > > had only getter methods (i.e. they were immutable objects), then no > > violation of LSP could occur." > > So while it can cause violation, it isn't a violation by itself. > > > > -- > > Ferenc Kovács > > @Tyr43l - http://tyrael.hu > > > > -- > > PHP Internals - PHP Runtime Development Mailing List > > To unsubscribe, visit: http://www.php.net/unsub.php > > > >