• ArrayObject class unusable as array

    From alex@21:1/5 to All on Fri Jul 23 10:17:51 2021
    Why?

    Here is the demonstration:

    array_merge(
    new ArrayObject,
    new ArrayObject,
    );


    Warning: array_merge(): Expected parameter 1 to be an array, object given

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Arno Welzel@21:1/5 to All on Fri Jul 23 12:36:14 2021
    alex:

    Why?

    Here is the demonstration:

    array_merge(
    new ArrayObject,
    new ArrayObject,
    );


    Warning: array_merge(): Expected parameter 1 to be an array, object given

    Yes - this is the expected result. That's why there is getArrayCopy():

    <https://www.php.net/manual/en/arrayobject.getarraycopy.php>


    --
    Arno Welzel
    https://arnowelzel.de

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From alex@21:1/5 to All on Sat Jul 24 09:34:28 2021
    Il 23/07/21 12:36, Arno Welzel ha scritto:
    alex:

    Why?

    Here is the demonstration:

    array_merge(
    new ArrayObject,
    new ArrayObject,
    );


    Warning: array_merge(): Expected parameter 1 to be an array, object given

    Yes - this is the expected result. That's why there is getArrayCopy():

    <https://www.php.net/manual/en/arrayobject.getarraycopy.php>



    class MyClass {
    function __toString(){
    return __CLASS__;
    }
    }

    function my_function(string $string){
    echo "$string\n";
    }

    echo "Object to string implicit conversion: OK \n";
    my_function(
    new MyClass
    );

    echo "Object to array implicit conversion: ERROR \n";
    array_merge(
    new ArrayObject,
    new ArrayObject,
    );

    Output:

    Object to string implicit conversion: OK
    MyClass
    Object to array implicit conversion: ERROR

    Warning: array_merge(): Expected parameter 1 to be an array, object
    given in /home/rino/Scaricati/esperimenti/merge-ArrayObject.php

    Why?

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Arno Welzel@21:1/5 to All on Sun Jul 25 19:03:55 2021
    alex:

    [...]
    echo "Object to array implicit conversion: ERROR \n";
    array_merge(
    new ArrayObject,
    new ArrayObject,
    );

    Output:

    Object to string implicit conversion: OK
    MyClass
    Object to array implicit conversion: ERROR

    Warning: array_merge(): Expected parameter 1 to be an array, object
    given in /home/rino/Scaricati/esperimenti/merge-ArrayObject.php

    Because ArrayObject() is not an array.

    See <https://www.php.net/manual/en/class.arrayobject.php>

    --
    Arno Welzel
    https://arnowelzel.de

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From alex@21:1/5 to All on Mon Jul 26 09:40:50 2021
    Il 25/07/21 19:03, Arno Welzel ha scritto:
    alex:

    [...]
    echo "Object to array implicit conversion: ERROR \n";
    array_merge(
    new ArrayObject,
    new ArrayObject,
    );

    Output:

    Object to string implicit conversion: OK
    MyClass
    Object to array implicit conversion: ERROR

    Warning: array_merge(): Expected parameter 1 to be an array, object
    given in /home/rino/Scaricati/esperimenti/merge-ArrayObject.php

    Because ArrayObject() is not an array.

    See <https://www.php.net/manual/en/class.arrayobject.php>


    mmmmhhhhhhhhhh...
    Just like MyClass is not a string... :|

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Arno Welzel@21:1/5 to All on Mon Jul 26 12:12:48 2021
    alex:

    Il 25/07/21 19:03, Arno Welzel ha scritto:
    alex:

    [...]
    echo "Object to array implicit conversion: ERROR \n";
    array_merge(
    new ArrayObject,
    new ArrayObject,
    );

    Output:

    Object to string implicit conversion: OK
    MyClass
    Object to array implicit conversion: ERROR

    Warning: array_merge(): Expected parameter 1 to be an array, object
    given in /home/rino/Scaricati/esperimenti/merge-ArrayObject.php

    Because ArrayObject() is not an array.

    See <https://www.php.net/manual/en/class.arrayobject.php>


    mmmmhhhhhhhhhh...
    Just like MyClass is not a string... :|

    Yes, but MyClass provides the method __toString() which allows it to be
    used *like* a string. When asked for, MyClass will just return a string representation of itself as the return value of its __toString() method.

    However - there is no __toArray() method to rturn an array when needed.
    That's the reason why ArrayObject provides getArrayCopy() to get a copy
    of the array object as an array value.

    Also see:

    <https://www.php.net/manual/en/language.oop5.magic.php> <https://www.php.net/manual/en/arrayobject.getarraycopy.php>

    --
    Arno Welzel
    https://arnowelzel.de

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From alex@21:1/5 to All on Mon Jul 26 12:48:39 2021
    Il 26/07/21 12:12, Arno Welzel ha scritto:
    alex:

    Il 25/07/21 19:03, Arno Welzel ha scritto:
    alex:

    [...]
    echo "Object to array implicit conversion: ERROR \n";
    array_merge(
    new ArrayObject,
    new ArrayObject,
    );

    Output:

    Object to string implicit conversion: OK
    MyClass
    Object to array implicit conversion: ERROR

    Warning: array_merge(): Expected parameter 1 to be an array, object
    given in /home/rino/Scaricati/esperimenti/merge-ArrayObject.php

    Because ArrayObject() is not an array.

    See <https://www.php.net/manual/en/class.arrayobject.php>


    mmmmhhhhhhhhhh...
    Just like MyClass is not a string... :|

    Yes, but MyClass provides the method __toString() which allows it to be
    used *like* a string. When asked for, MyClass will just return a string representation of itself as the return value of its __toString() method.

    However - there is no __toArray() method to rturn an array when needed. That's the reason why ArrayObject provides getArrayCopy() to get a copy
    of the array object as an array value.

    Also see:

    <https://www.php.net/manual/en/language.oop5.magic.php> <https://www.php.net/manual/en/arrayobject.getarraycopy.php>


    However, the method should not be called

    class C extends ArrayObject {
    function getArrayCopy(){
    echo 'CALLED';
    }
    }

    array_merge(
    (array) new C,
    (array) new C,
    );

    No output (CALLED)!!!

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Jerry Stuckle@21:1/5 to alex on Mon Jul 26 14:38:25 2021
    On 7/26/2021 6:48 AM, alex wrote:
    Il 26/07/21 12:12, Arno Welzel ha scritto:
    alex:

    Il 25/07/21 19:03, Arno Welzel ha scritto:
    alex:

    [...]
    echo "Object to array implicit conversion: ERROR \n";
    array_merge(
           new ArrayObject,
           new ArrayObject,
    );

    Output:

    Object to string implicit conversion: OK
    MyClass
    Object to array implicit conversion: ERROR

    Warning: array_merge(): Expected parameter 1 to be an array, object
    given in /home/rino/Scaricati/esperimenti/merge-ArrayObject.php

    Because ArrayObject() is not an array.

    See <https://www.php.net/manual/en/class.arrayobject.php>


    mmmmhhhhhhhhhh...
    Just like MyClass is not a string... :|

    Yes, but MyClass provides the method __toString() which allows it to be
    used *like* a string. When asked for, MyClass will just return a string
    representation of itself as the return value of its __toString() method.

    However - there is no __toArray() method to rturn an array when needed.
    That's the reason why ArrayObject provides getArrayCopy() to get a copy
    of the array object as an array value.

    Also see:

    <https://www.php.net/manual/en/language.oop5.magic.php>
    <https://www.php.net/manual/en/arrayobject.getarraycopy.php>


    However, the method should not be called

    class C extends ArrayObject {
        function getArrayCopy(){
            echo 'CALLED';
        }
    }

    array_merge(
        (array) new C,
        (array) new C,
    );

    No output (CALLED)!!!

    Because you never called the function!

    --
    ==================
    Remove the "x" from my email address
    Jerry Stuckle
    jstucklex@attglobal.net
    ==================

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Arno Welzel@21:1/5 to All on Fri Jul 30 12:34:27 2021
    alex:

    Il 26/07/21 12:12, Arno Welzel ha scritto:
    alex:

    Il 25/07/21 19:03, Arno Welzel ha scritto:
    alex:

    [...]
    echo "Object to array implicit conversion: ERROR \n";
    array_merge(
    new ArrayObject,
    new ArrayObject,
    );

    Output:

    Object to string implicit conversion: OK
    MyClass
    Object to array implicit conversion: ERROR

    Warning: array_merge(): Expected parameter 1 to be an array, object
    given in /home/rino/Scaricati/esperimenti/merge-ArrayObject.php

    Because ArrayObject() is not an array.

    See <https://www.php.net/manual/en/class.arrayobject.php>


    mmmmhhhhhhhhhh...
    Just like MyClass is not a string... :|

    Yes, but MyClass provides the method __toString() which allows it to be
    used *like* a string. When asked for, MyClass will just return a string
    representation of itself as the return value of its __toString() method.

    However - there is no __toArray() method to rturn an array when needed.
    That's the reason why ArrayObject provides getArrayCopy() to get a copy
    of the array object as an array value.

    Also see:

    <https://www.php.net/manual/en/language.oop5.magic.php>
    <https://www.php.net/manual/en/arrayobject.getarraycopy.php>


    However, the method should not be called

    class C extends ArrayObject {
    function getArrayCopy(){
    echo 'CALLED';
    }
    }

    array_merge(
    (array) new C,
    (array) new C,
    );

    No output (CALLED)!!!

    Yes, that is what I am talking about all the time!

    You CAN NOT cast classes to arrays and you CAN NOT use classes like
    arrays. You MUST call the method of the class which gives you the
    content as array value:

    class C extends ArrayObject {
    function getArrayCopy(){
    echo 'CALLED';
    }
    }

    $a = new C();
    $b = new C();

    array_merge(
    $a->getArrayCopy(),
    $b->getArrayCopy()
    )

    I have explained all there is to say about now. Please take your time to understand how classes and types work in PHP before asking again why
    your idea does not work.

    --
    Arno Welzel
    https://arnowelzel.de

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)