Bug #46105 [Com]: mysql_fetch_object calls constructor on object after setting up properties
| From: | mohammed dot tarek at hotmail dot com | Date: | Tue, 29 Nov 2011 15:40:01 +0000 |
| Subject: | Bug #46105 [Com]: mysql_fetch_object calls constructor on object after setting up properties | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-165562@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=46105&edit=1
ID: 46105
Comment by: mohammed dot tarek at hotmail dot com
Reported by: ninzya at inbox dot lv
Summary: mysql_fetch_object calls constructor on object after
setting up properties
Status: Wont fix
Type: Bug
Package: MySQL related
Operating System: Windows XP
PHP Version: 5.3.0alpha2
Assigned To: mysql
Block user comment: N
Private report: N
New Comment:
how this bug can happen
this function can be useful but with this strange behavior of the function it
can't used
Previous Comments:
------------------------------------------------------------------------
[2008-11-03 16:15:15] ninzya at inbox dot lv
Well, then you should't fix any bugs at all and have bugtracker, because some folk's code
may rely on those bugs. This is not a valid behavior, you HAVE TO fix this, and if necessary, warn
users about the change. If this "feature" is not documented, there should be a slight
warning about this.
------------------------------------------------------------------------
[2008-11-03 15:48:53] johannes@php.net
Yes, the behavior can be considered wrong, unfortunately we can't change it as code might rely
on that order, like doing work with the data in the constructor ...
------------------------------------------------------------------------
[2008-09-17 12:35:52] ninzya at inbox dot lv
Description:
------------
when using custom object return through mysql_fetch_object, function allocates specified in second
parameter object, sets up all properties and then calls constructor. I think this is wrong. Newly
instantiated object's constructor must be called before any other operation on the object is
performed.
Reproduce code:
---------------
/**
* Object class
*
*/
class Object {
/**
* Array of properties
*
* @var array
*/
protected $_props =array();
/**
* Construct object
*
* @param array $props
*/
public function __construct( $props =array()) {
var_dump( 'constr');
$this->_props =$props;
}
/**
* Magic method override
*
* @param string $key
*/
public function __isset( $key) {
var_dump( 'isset');
return array_key_exists( $key, $this->_props);
}
/**
* Magic method override
*
* @param string $key
* @return mixed/null
*/
public function __get( $key) {
var_dump( 'get');
if( !array_key_exists( $key, $this->_props))
return null;// entry does not exist
// return obtained value
return $this->_props[ $key];
}
/**
* Magic method override
*
* @param string $key
* @param mixed $value
*/
public function __set( $key, $value) {
var_dump( 'set');
$this->_props[ $key] =$value;
}
/**
* Magic method override
*
* @param string $key
*/
public function __unset( $key) {
var_dump( 'unset');
unset( $this->_props[ $key]);
}
/**
* Get associated array
*
* @return array
*/
public function __invoke() {
var_dump( 'invoke');
return $this->_props;
}
/**
* Get object name
*
* @return string
*/
public function __toString() {
return __CLASS__;
}
}
......
mysql_fetch_object( $result, 'Object');
Expected result:
----------------
string(6) "constr"
string(3) "set"
string(3) "set"
string(3) "set"
string(3) "set"
Actual result:
--------------
string(3) "set"
string(3) "set"
string(3) "set"
string(3) "set"
string(6) "constr"
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=46105&edit=1