FAQ
Since we introduce class type hints in PHP 5.0 I think it would be a
good thing [tm] to add multi-method dispatch in PHP 5.1.

What I mean by this would be to allow for the following:

class Foo {
public function doSomething(Foo $foo) {}

public function doSomething(Bar $bar) {}
}

How complicated would this be to implement?

Search Discussions

  • Andrey Hristov at Apr 20, 2004 at 6:50 pm

    Quoting Sebastian Bergmann <[email protected]>:

    Since we introduce class type hints in PHP 5.0 I think it would be a
    good thing [tm] to add multi-method dispatch in PHP 5.1.

    What I mean by this would be to allow for the following:

    class Foo {
    public function doSomething(Foo $foo) {}

    public function doSomething(Bar $bar) {}
    }

    How complicated would this be to implement?
    Hi,
    yesterday while waiting at the UBahn (Metro) station I came to the idea such
    thing can me made in userland. func_get_args() can help combined with
    get_type() for simple types. if it's class than => use also the class name if
    you want.

    <?php
    class fubar {
    protected function doSomething_integer_integer_double($i1,$i2,$f) {
    $a = func_get_args();var_dump(__METHOD__, $a);
    }
    protected function doSomething_integer_double($i,$f) {
    $a = func_get_args();var_dump(__METHOD__, $a);
    }

    public function doSomething() {
    $args = func_get_args();
    $method_name = __FUNCTION__;
    foreach ($args as $v) {
    $method_name .= "_".gettype($v);
    }
    if (method_exists($this, $method_name)) {
    return call_user_func_array(array($this, $method_name),
    $args);
    }
    }
    }//class fubar

    $a = new fubar();
    $a->doSomething(1, 2.0);
    $a->doSomething(3,4, 5.0);
    ?>

    Cheers,
    Andrey
  • George Schlossnagle at Apr 20, 2004 at 6:55 pm

    On Apr 20, 2004, at 2:51 PM, Andrey Hristov wrote:

    Quoting Sebastian Bergmann <[email protected]>:
    Since we introduce class type hints in PHP 5.0 I think it would be a
    good thing [tm] to add multi-method dispatch in PHP 5.1.

    What I mean by this would be to allow for the following:

    class Foo {
    public function doSomething(Foo $foo) {}

    public function doSomething(Bar $bar) {}
    }

    How complicated would this be to implement?
    Hi,
    yesterday while waiting at the UBahn (Metro) station I came to the
    idea such
    thing can me made in userland. func_get_args() can help combined with
    get_type() for simple types. if it's class than => use also the class
    name if
    you want.

    <?php
    class fubar {
    protected function
    doSomething_integer_integer_double($i1,$i2,$f) {
    $a = func_get_args();var_dump(__METHOD__, $a);
    }
    protected function doSomething_integer_double($i,$f) {
    $a = func_get_args();var_dump(__METHOD__, $a);
    }

    public function doSomething() {
    $args = func_get_args();
    $method_name = __FUNCTION__;
    foreach ($args as $v) {
    $method_name .= "_".gettype($v);
    }
    if (method_exists($this, $method_name)) {
    return call_user_func_array(array($this,
    $method_name),
    $args);
    }
    }
    }//class fubar

    $a = new fubar();
    $a->doSomething(1, 2.0);
    $a->doSomething(3,4, 5.0);
    ?>
    The problem with this is that that integer may well be a string when
    you look at it. There's no good way to do this past discriminating
    between scalar, array and object (by type, of course). I personally
    think that that is fine (adding an array typehint would be nice).

    George
  • Marcus Boerger at Apr 20, 2004 at 7:18 pm
    Hello George,

    Tuesday, April 20, 2004, 8:57:31 PM, you wrote:
    On Apr 20, 2004, at 2:51 PM, Andrey Hristov wrote:

    Quoting Sebastian Bergmann <[email protected]>:
    Since we introduce class type hints in PHP 5.0 I think it would be a
    good thing [tm] to add multi-method dispatch in PHP 5.1.

    What I mean by this would be to allow for the following:

    class Foo {
    public function doSomething(Foo $foo) {}

    public function doSomething(Bar $bar) {}
    }

    How complicated would this be to implement?
    Hi,
    yesterday while waiting at the UBahn (Metro) station I came to the
    idea such
    thing can me made in userland. func_get_args() can help combined with
    get_type() for simple types. if it's class than => use also the class
    name if
    you want.

    <?php
    class fubar {
    protected function
    doSomething_integer_integer_double($i1,$i2,$f) {
    $a = func_get_args();var_dump(__METHOD__, $a);
    }
    protected function doSomething_integer_double($i,$f) {
    $a = func_get_args();var_dump(__METHOD__, $a);
    }

    public function doSomething() {
    $args = func_get_args();
    $method_name = __FUNCTION__;
    foreach ($args as $v) {
    $method_name .= "_".gettype($v);
    }
    if (method_exists($this, $method_name)) {
    return call_user_func_array(array($this,
    $method_name),
    $args);
    }
    }
    }//class fubar

    $a = new fubar();
    $a->doSomething(1, 2.0);
    $a->doSomething(3,4, 5.0);
    ?>
    The problem with this is that that integer may well be a string when
    you look at it. There's no good way to do this past discriminating
    between scalar, array and object (by type, of course). I personally
    think that that is fine (adding an array typehint would be nice).
    Somewhere at my server should be a patch for "array". For some reason
    i was too lazy to ask for that to commit again before RC1. I you still
    want this just ask Andi/Zeev again.

    --
    Best regards,
    Marcus mailto:[email protected]
  • George Schlossnagle at Apr 20, 2004 at 7:27 pm

    On Apr 20, 2004, at 3:18 PM, Marcus Boerger wrote:
    The problem with this is that that integer may well be a string when
    you look at it. There's no good way to do this past discriminating
    between scalar, array and object (by type, of course). I personally
    think that that is fine (adding an array typehint would be nice).
    Somewhere at my server should be a patch for "array". For some reason
    i was too lazy to ask for that to commit again before RC1. I you still
    want this just ask Andi/Zeev again.
    Andi/Zeev,

    Thoughts on allowing array typehinting?

    George
  • Andi Gutmans at Apr 21, 2004 at 9:50 am

    At 03:29 PM 4/20/2004 -0400, George Schlossnagle wrote:
    On Apr 20, 2004, at 3:18 PM, Marcus Boerger wrote:
    The problem with this is that that integer may well be a string when
    you look at it. There's no good way to do this past discriminating
    between scalar, array and object (by type, of course). I personally
    think that that is fine (adding an array typehint would be nice).
    Somewhere at my server should be a patch for "array". For some reason
    i was too lazy to ask for that to commit again before RC1. I you still
    want this just ask Andi/Zeev again.
    Andi/Zeev,

    Thoughts on allowing array typehinting?
    I don't have a problem with array type hinting but I want to roll RC2. I
    suggest we look at Marcus' patch after RC2 and see if it's small enough to
    allow the inclusion before 5.0.0.

    Andi
  • Marcus Boerger at Apr 21, 2004 at 11:29 pm
    Hello Andi,

    the patch is here. It's a bit outdated but shouldn't cause much
    problems to apply after RC2. It allows "Class", "Array" but atm
    misses "Resource".

    marcus

    Wednesday, April 21, 2004, 11:50:46 AM, you wrote:
    At 03:29 PM 4/20/2004 -0400, George Schlossnagle wrote:
    On Apr 20, 2004, at 3:18 PM, Marcus Boerger wrote:
    The problem with this is that that integer may well be a string when
    you look at it. There's no good way to do this past discriminating
    between scalar, array and object (by type, of course). I personally
    think that that is fine (adding an array typehint would be nice).
    Somewhere at my server should be a patch for "array". For some reason
    i was too lazy to ask for that to commit again before RC1. I you still
    want this just ask Andi/Zeev again.
    Andi/Zeev,

    Thoughts on allowing array typehinting?
    I don't have a problem with array type hinting but I want to roll RC2. I
    suggest we look at Marcus' patch after RC2 and see if it's small enough to
    allow the inclusion before 5.0.0.
    Andi


    --
    Best regards,
    Marcus mailto:[email protected]
  • Jason Garber at Apr 22, 2004 at 12:14 am
    Just a note,

    Would "Object" be more appropriate than "Class"? The expected variable
    type is an object (defined by a class), and the gettype() function returns
    'object'..

    # php -r '$x=new stdclass(); var_dump(gettype($x));'
    string(6) "object"

    It may mean adding a new reserved word though.

    ~Jason


    At 4/22/2004 01:29 AM +0200, Marcus Boerger wrote:
    Hello Andi,

    the patch is here. It's a bit outdated but shouldn't cause much
    problems to apply after RC2. It allows "Class", "Array" but atm
    misses "Resource".

    marcus

    Wednesday, April 21, 2004, 11:50:46 AM, you wrote:
    At 03:29 PM 4/20/2004 -0400, George Schlossnagle wrote:
    On Apr 20, 2004, at 3:18 PM, Marcus Boerger wrote:
    The problem with this is that that integer may well be a string when
    you look at it. There's no good way to do this past discriminating
    between scalar, array and object (by type, of course). I personally
    think that that is fine (adding an array typehint would be nice).
    Somewhere at my server should be a patch for "array". For some reason
    i was too lazy to ask for that to commit again before RC1. I you still
    want this just ask Andi/Zeev again.
    Andi/Zeev,

    Thoughts on allowing array typehinting?
    I don't have a problem with array type hinting but I want to roll RC2. I
    suggest we look at Marcus' patch after RC2 and see if it's small enough to
    allow the inclusion before 5.0.0.
    Andi


    --
    Best regards,
    Marcus mailto:[email protected]

    --
    PHP Internals - PHP Runtime Development Mailing List
    To unsubscribe, visit: http://www.php.net/unsub.php
  • Marcus Boerger at Apr 22, 2004 at 8:03 am
    Hello Jason,

    no. Object can be a classname, Class not.
    The reason gettype returns "object" is becuase an instance of a class is an
    object. In typehinting we deal with the class-types and for things like
    reflection we need a typehint that accepts any class but nothing else.

    marcus

    Thursday, April 22, 2004, 2:15:01 AM, you wrote:
    Just a note,
    Would "Object" be more appropriate than "Class"? The expected variable
    type is an object (defined by a class), and the gettype() function returns
    'object'..
    # php -r '$x=new stdclass(); var_dump(gettype($x));'
    string(6) "object"
    It may mean adding a new reserved word though.
    ~Jason
    At 4/22/2004 01:29 AM +0200, Marcus Boerger wrote:
    Hello Andi,

    the patch is here. It's a bit outdated but shouldn't cause much
    problems to apply after RC2. It allows "Class", "Array" but atm
    misses "Resource".

    marcus

    Wednesday, April 21, 2004, 11:50:46 AM, you wrote:
    At 03:29 PM 4/20/2004 -0400, George Schlossnagle wrote:
    On Apr 20, 2004, at 3:18 PM, Marcus Boerger wrote:
    The problem with this is that that integer may well be a string when
    you look at it. There's no good way to do this past discriminating
    between scalar, array and object (by type, of course). I personally
    think that that is fine (adding an array typehint would be nice).
    Somewhere at my server should be a patch for "array". For some reason
    i was too lazy to ask for that to commit again before RC1. I you still
    want this just ask Andi/Zeev again.
    Andi/Zeev,

    Thoughts on allowing array typehinting?
    I don't have a problem with array type hinting but I want to roll RC2. I
    suggest we look at Marcus' patch after RC2 and see if it's small enough to
    allow the inclusion before 5.0.0.
    Andi


    --
    Best regards,
    Marcus mailto:[email protected]

    --
    PHP Internals - PHP Runtime Development Mailing List
    To unsubscribe, visit: http://www.php.net/unsub.php



    --
    Best regards,
    Marcus mailto:[email protected]
  • Andrey Hristov at Apr 21, 2004 at 6:29 am

    George Schlossnagle wrote:
    ..
    $a = new fubar();
    $a->doSomething(1, 2.0);
    $a->doSomething(3,4, 5.0);
    ?>

    The problem with this is that that integer may well be a string when you
    look at it. There's no good way to do this past discriminating between
    scalar, array and object (by type, of course). I personally think that
    that is fine (adding an array typehint would be nice).

    George
    Hi George,
    an integer can be represented as string or the float can be also a string and in this case
    it won't work but it works for situation where the programmer knows what he is doing. Joe
    average won't need the language feature thus won't need to implement it even in userland.
    Sebastian's case was about classes and an object cannot be anything else but object
    protected function doSomething_objectBar_objectFoo($bar, $foo) {}
    public function doSomething() {
    $args = func_get_args();
    $method_name = __FUNCTION__;
    foreach ($args as $v) {
    $type = $v;
    $method_name .= "_".gettype($v);
    if ($type === "object") $method_name .= get_class($v);
    }

    Of course this is quite fast :/

    Cheers,
    Andrey
  • Andrey Hristov at Apr 21, 2004 at 6:49 am

    Andrey Hristov wrote:
    .....
    .....
    ah, the code has an error and I found more efficient way (for objects no need of string
    compare):
    <?php
    class Fubar {
    protected function doSomething_integer_integer_double($i1,$i2,$f) {
    $a = func_get_args();var_dump(__METHOD__, $a);
    }
    protected function doSomething_integer_double($i,$f) {
    $a = func_get_args();var_dump(__METHOD__, $a);
    }
    protected function doSomething_objectFubar($fub) {
    $a = func_get_args();var_dump(__METHOD__, $a);
    }

    public function doSomething() {
    $args = func_get_args();
    $method_name = __FUNCTION__;
    foreach ($args as $v) {
    $method_name .= "_".gettype($v);
    if (FALSE !==($c_name = get_class($v))) {
    $method_name .= $c_name;
    }
    }
    if (method_exists($this, $method_name)) {
    return call_user_func_array(array($this, $method_name), $args);
    }
    }
    }//class fubar

    $a = new fubar();
    $a->doSomething(1, 2.0);
    $a->doSomething(3,4, 5.0);
    $a->doSomething($a);
    ?>

    OTOH hinting for array (internally) will be nice also.

    Cheers,
    Andrey
  • Johannes Schlueter at Apr 21, 2004 at 7:05 am

    Andrey Hristov wrote:
    class foobar { [...]
    protected function doSomething_objectFubar($fub) {
    $a = func_get_args();var_dump(__METHOD__, $a);
    }

    public function doSomething() {
    $args = func_get_args();
    $method_name = __FUNCTION__;
    foreach ($args as $v) {
    $method_name .= "_".gettype($v);
    if (FALSE !==($c_name = get_class($v))) {
    $method_name .= $c_name;
    }
    }
    if (method_exists($this, $method_name)) {
    return call_user_func_array(array($this, $method_name), $args);
    }
    }
    }//class fubar
    Now I do a
    <?php
    class barfoo extends foobar {
    }

    $barfoo = new barfoo();
    $barfoo->doSomething($barfoo);
    ?>

    And it won't work anymore,so I can't extend te class anymore without
    changing the class foobar....

    johannes
  • Andrey Hristov at Apr 21, 2004 at 12:52 pm

    Quoting Johannes Schlueter <[email protected]>:

    Andrey Hristov wrote:
    class foobar { [...]
    protected function doSomething_objectFubar($fub) {
    $a = func_get_args();var_dump(__METHOD__, $a);
    }

    public function doSomething() {
    $args = func_get_args();
    $method_name = __FUNCTION__;
    foreach ($args as $v) {
    $method_name .= "_".gettype($v);
    if (FALSE !==($c_name = get_class($v))) {
    $method_name .= $c_name;
    }
    }
    if (method_exists($this, $method_name)) {
    return call_user_func_array(array($this, $method_name), $args);
    }
    }
    }//class fubar
    Now I do a
    <?php
    class barfoo extends foobar {
    }

    $barfoo = new barfoo();
    $barfoo->doSomething($barfoo);
    ?>

    And it won't work anymore,so I can't extend te class anymore without
    changing the class foobar....
    Yepp :/

    Andrey
  • John Coggeshall at Apr 21, 2004 at 9:34 am

    On Wed, 2004-04-21 at 02:47, Andrey Hristov wrote:
    OTOH hinting for array (internally) will be nice also.
    Arrays are the only complex type that we can't hint, I'd love to see
    this sort of thing implemented.

    John

    --
    -=~=--=~=--=~=--=~=--=~=--=~=--=~=--=~=--=~=--=~=--=~=--=~=-
    John Coggeshall http://www.coggeshall.org/
    The PHP Developer's Handbook http://www.php-handbook.com/
    -=~=--=~=--=~=--=~=--=~=--=~=--=~=--=~=--=~=--=~=--=~=--=~=-
  • Marcus Boerger at Apr 21, 2004 at 9:52 am
    Hello John,

    Wednesday, April 21, 2004, 11:34:01 AM, you wrote:
    On Wed, 2004-04-21 at 02:47, Andrey Hristov wrote:
    OTOH hinting for array (internally) will be nice also.
    Arrays are the only complex type that we can't hint, I'd love to see
    this sort of thing implemented.
    Not completely right, we miss resources also.

    --
    Best regards,
    Marcus mailto:[email protected]
  • Christian Schneider at Apr 20, 2004 at 8:55 pm

    Sebastian Bergmann wrote:
    Since we introduce class type hints in PHP 5.0 I think it would be a
    good thing [tm] to add multi-method dispatch in PHP 5.1.
    Actually I think multi-method dispatching for PHP is A Bad Thing[tm].

    Multi-method dispatching is necessary for statically checked, inflexible
    languages without default parameters like Java. PHP has other means of
    handling the most common problems this tries to solve and having two
    methods of the same name is more confusing than helping IMHO.

    PINJ,
    - Chris
  • Michael Walter at Apr 21, 2004 at 5:32 am

    Christian Schneider wrote:
    Sebastian Bergmann wrote:
    Since we introduce class type hints in PHP 5.0 I think it would be a
    good thing [tm] to add multi-method dispatch in PHP 5.1.

    Actually I think multi-method dispatching for PHP is A Bad Thing[tm].

    Multi-method dispatching is necessary for statically checked, inflexible
    languages without default parameters like Java.
    That's probably why Common Lisp, a language way more dynamic than PHP,
    provides you with a complete implementation of multiple dispatch. How
    exactly do you think are default parameters related to the issue, anyway?
    PHP has other means of handling the most common problems this tries to solve and having two
    methods of the same name is more confusing than helping IMHO.
    I assume you are you aware of what dynamic dispatch is trying to solve
    -- could you give an example of the 'other means' you are referring to?

    Cheers,
    Michael
  • Jason Garber at Apr 21, 2004 at 6:21 am
    If it makes any difference...

    I would say no way to multi method dispatch. PHP, in my understanding, was
    a loosely typed language, and this is straining against that very
    concept. In the rare case that one needs multi-method dispatch, they can
    use a format such as:

    class xyz
    {
    public function Foo($p1 = NULL, $p2 = NULL)
    {
    if($p1 instanceof Bar && is_numeric($p2))
    {
    //do something or
    return $this->Foo_Bar_Int($p1, $p2);
    }
    elseif($p1 instanceof OtherBar && is_null($p2))
    {
    //do something or
    return $this->Foo_Otherbar($p1);
    }
    }

    ...

    }


    ~Jason

    At 4/21/2004 07:32 AM +0200, Michael Walter wrote:
    Christian Schneider wrote:
    Sebastian Bergmann wrote:
    Since we introduce class type hints in PHP 5.0 I think it would be a
    good thing [tm] to add multi-method dispatch in PHP 5.1.
    Actually I think multi-method dispatching for PHP is A Bad Thing[tm].
    Multi-method dispatching is necessary for statically checked, inflexible
    languages without default parameters like Java.
    That's probably why Common Lisp, a language way more dynamic than PHP,
    provides you with a complete implementation of multiple dispatch. How
    exactly do you think are default parameters related to the issue, anyway?
    PHP has other means of handling the most common problems this tries to
    solve and having two methods of the same name is more confusing than
    helping IMHO.
    I assume you are you aware of what dynamic dispatch is trying to solve --
    could you give an example of the 'other means' you are referring to?

    Cheers,
    Michael

    --
    PHP Internals - PHP Runtime Development Mailing List
    To unsubscribe, visit: http://www.php.net/unsub.php
  • Christian Schneider at Apr 21, 2004 at 9:13 am

    Michael Walter wrote:
    How exactly do you think are default parameters related to the issue, anyway?
    Java uses multi-method dispatch to work around missing default values:
    function foo($a, $some_flag) { ... }
    function foo($a) { foo($a, false); }
    instead of
    function foo($a, $some_flag = false) { ... }
    I assume you are you aware of what dynamic dispatch is trying to solve
    Whatever example I'd give you'd probably say it's not the relevant one.
    But if you give me a use case for dynamic dispatch I show you how I'd do
    it in PHP. Maybe we should take that off list though and present just
    the result of our research :-)

    - Chris
  • Wez Furlong at Apr 21, 2004 at 9:24 am

    Maybe we should take that off list though and present just
    the result of our research :-)
    Yes please ;)
  • Andi Gutmans at Apr 21, 2004 at 9:55 am
    I don't want to prolong this discussion but I agree with the people who are
    against multi-method dispatch. I don't think it makes much sense in PHP,
    and I think that in the few places where someone really feels they need it,
    it can be implemented in user-land. It's just going to complicate the
    language for a small minority of people who feel they need this feature.

    Andi
  • Jevon Wright at Apr 21, 2004 at 10:13 am
    But at the same time, it would be nice to have a standardised multi-method
    syntax or code - or users might develop their own weird and wacky,
    inconsistent ways of implementing it. Perhaps the code submitted before
    could be included in the PHP documentation, telling users on how they could
    emulate this style of code?

    Jevon

    ----- Original Message -----
    From: "Andi Gutmans" <[email protected]>
    To: "Christian Schneider" <[email protected]>; "Michael Walter"
    <[email protected]>
    Cc: <[email protected]>
    Sent: Wednesday, April 21, 2004 9:55 PM
    Subject: Re: [PHP-DEV] Re: Multi-Method Dispatch in PHP 5.1?

    I don't want to prolong this discussion but I agree with the people who are
    against multi-method dispatch. I don't think it makes much sense in PHP,
    and I think that in the few places where someone really feels they need it,
    it can be implemented in user-land. It's just going to complicate the
    language for a small minority of people who feel they need this feature.

    Andi



    --
    PHP Internals - PHP Runtime Development Mailing List
    To unsubscribe, visit: http://www.php.net/unsub.php
  • Michael Walter at Apr 21, 2004 at 11:26 am

    Christian Schneider wrote:
    Michael Walter wrote:
    How exactly do you think are default parameters related to the issue,
    anyway?

    Java uses multi-method dispatch to work around missing default values:
    function foo($a, $some_flag) { ... }
    function foo($a) { foo($a, false); }
    instead of
    function foo($a, $some_flag = false) { ... }
    Well yeah, we were presumably talking about different things, hence the
    question :) What you are talking about is a certain kind of "compile
    time" polymorphism, where the appropriate method is chosen at compile time.

    I was referring to "runtime" polymorphism, i.e. the _dispatch_ is done
    on not only on one type (as with the type of the $object in an
    $object->method() call), but on 2 types (as in multimethod($rect,$circle)).

    I'm pretty sure that Sebastian was referring to the same mechanism, as
    his example would need dispatch on 2 types, too, in order to work.

    Also, I think functions which are dispatched using multiple types might
    as well be global functions, because usually (?) there is no such thing
    as a "first class" and "second class" dispatchee (is that a word?). For
    instance, consider:

    function collides(Rect $rect, Rect $circle) { ... }
    function collides(Rect $rect, Circle $circle) { ... }
    I assume you are you aware of what dynamic dispatch is trying to solve
    Whatever example I'd give you'd probably say it's not the relevant one.
    Naw, I didn't want to piss you of, just check whether we were dealing
    with the same thing. :)
    But if you give me a use case for dynamic dispatch I show you how I'd do
    it in PHP. Maybe we should take that off list though and present just
    the result of our research :-)
    Yeah, well, you will show me the visitor pattern, which is an inferior
    work-around for the lack of multiple dispatch (because it only works
    well for closed sets of classes, although having it work for an open set
    of classes like with dynamic dispatch on the $this 'pointer' is desirable).

    For a typical example, you might want to check out the Gang of Four book
    (Visitor pattern, which simulates multiple dispatch for multiple = 2) or
    consider above's collides() example.

    The main difference between the 'isinstance' solution someone on this
    list posted is that you do not have to _modify_ a big large collides()
    function, but you just keep adding the new cases.

    This is like with inheritance -- you use inheritance and dynamic
    dispatch on the $this 'pointer' in order to avoid series of 'isinstance'
    checks.

    Anyway, I'm not really sure whether dynamic dispatch is appropriate in
    PHP myself, but I felt like pointing out the differences between static
    and dynamic dispatch might be important. ;)

    Cheers,
    Michael
  • Related Discussions

    Discussion Navigation
    viewthread | post
    Discussion Overview
    groupphp-internals @
    categoriesphp
    postedApr 20, '04 at 2:50p
    activeApr 22, '04 at 8:03a
    posts23
    users12
    websitephp.net

    People

    Translate

    site design / logo © 2023 Grokbase