php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #47955 ReflectionClass::newInstanceArgs() fails with references
Submitted: 2009-04-12 21:54 UTC Modified: 2009-05-21 16:37 UTC
Votes:1
Avg. Score:4.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:1 (100.0%)
Same OS:1 (100.0%)
From: richardcook at gmail dot com Assigned:
Status: Open Package: Reflection related
PHP Version: 5.*, 6CVS (2009-05-14) OS: *
Private report: No CVE-ID:
Have you experienced this issue?
Rate the importance of this bug to you:

 [2009-04-12 21:54 UTC] richardcook at gmail dot com
Description:
------------
ReflectionClass::newInstanceArgs throws a constructor fail warning 
and does not create the class if the class' constructor has variable 
references in it

Reproduce code:
---------------
http://pastebin.com/f4a147910

Expected result:
----------------
Array
(
    [x] => 1
    [y] => 2
    [z] => 3
)
Foo Object
(
    [arr] => Array
        (
            [x] => 1
            [y] => 2
            [z] => 3
        )

)
Bar Object
(
    [foo] => Foo Object
        (
            [arr] => Array
                (
                    [x] => 1
                    [y] => 2
                    [z] => 3
                )

        )

    [arr] => Array
        (
            [x] => 1
            [y] => 2
            [z] => 3
        )

)

Actual result:
--------------
Warning: Invocation of Bar's constructor failed in [code path] on 
line 9

Fatal error: Call to a member function mod() on a non-object in [code 
path] on line 36

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2009-04-13 17:52 UTC] jani@php.net
<?php
class Foo {
  function __construct (&$arr) {
    $this->arr = &$arr;
  }
  function createInstance () {
    $reflectionClass = new ReflectionClass("Bar");
    return $reflectionClass->newInstanceArgs(array($this, $this-
>arr));
  }
  function mod($key, $val) {
    $this->arr[$key] = $val;
  }
}

class Bar {
  function __construct (&$foo, &$arr) {
    $this->foo = &$foo;
    $this->arr = &$arr;
}
  function mod($key, $val) {
    $this->arr[$key] = $val;
  }
}

$arr = array();

$foo = new Foo($arr);

$arr["x"] = 1;

$foo->mod("y", 2);

$bar = $foo->createInstance();

$bar->mod("z", 3);

var_dump($arr,$foo,$bar);

?>


 [2009-05-21 16:37 UTC] lbarnaud@php.net
It works when the elements of the array are references:

$reflectionClass->newInstanceArgs(array(&$this, &$this->arr));



 
PHP Copyright © 2001-2014 The PHP Group
All rights reserved.
Last updated: Wed Apr 23 07:02:14 2014 UTC