Re: optional object arguments to a function

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Nathan Rixham wrote:
> Shawn McKenzie wrote:
>> Michael A. Peters wrote:
>>> Rene Veerman wrote:
>>>> On Sat, Feb 13, 2010 at 9:05 AM, Michael A. Peters <mpeters@xxxxxxx>
>>>> wrote:
>>>>> How do I specify a default null object, or otherwise make the argument
>>>>> argument optional?
>>>>>
>>>> To my knowledge: can't be done.
>>>>
>>>> But you can check any args through the func_get_arg*() functions, then
>>>> per-parameter push 'm through a check function that checks if their
>>>> primary properties are set.
>>>> It's equivalent to checking for null ( / bad) objects.
>>>>
>>> Thank you to everybody. I think I will see how far I can get with
>>> func_get_arg - it may solve the problem.
>>>
>>> The other hackish solution I thought of is to put the object arguments
>>> into a key/value array and pass the array as a single argument to the
>>> function. That way I can check for the key and if the key is set, grab
>>> the object associated with it.
>> Maybe I mis-read your post, but what's wrong with Jochem's method.
>> That's what I was going to propose.
>>
> 
> This is a problem with php; you can't do the following (since object
> isn't a class):
>   function test( object $o = null )
> 
> so normally you'd do:
>   function test( stdClass $o = null )
> 
> but this only works for stdClass - (object)"something" and *not*
> instances of classes:
> 
>   <?php
>   class Foo {}
>   $o = new Foo();
>   test( $foo );
>   ?>
> 
> will fail because Foo is not an instance of stdClass
> 
> in short there is no way (in PHP) to type hint that something should be
> an object of any class.
> 
> thus you have two options to work around this; option 1:
> 
> check yourself:
>   function test( $o = null ) {
>     if( $o !== null && !is_object($o) ) {
>        throw new InvalidArgumentException( '$o must be an object' );
>     }
>   }
> 
> ensure you always only use instances of classes and not just
> "objects/stdClass" (or make everything extend stdClass <stupid>)
> 
> back to the main question - How do I specify a default null object -
> like this:
> 
> function foo($a='',$b='',$c=false, $o=null) {
>   if( $o !== null && !is_object($o) ) {
>     throw new InvalidArgumentException( '$o must be an object' );
>   }
>   // in the same way a you'd do
>   if( !is_string($a) ) {
>     throw new InvalidArgumentException( '$a must be a string' );
>   }
> }
> 
> side note: if you're finding you may need an unknown number of arguments
> then other than refactoring all your design to handle one argument at a
> time to avoid cross cutting concerns, then you're stuck with
> func_get_arg and checking each argument as you go; not strict but if it
> works and it's fast..
> 
> feel like I've just typed "blah blah blah" for the last 10 minutes, ahh
> well ho hum!
> 
> regards :)

I guess I missed the part where he wasn't going to know what class the
object was from.  I would think you would normally know.

function foo($a = '', $b = '', $c = false, myClass $o = null)


-- 
Thanks!
-Shawn
http://www.spidean.com

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux