Hello again,
Wow, this thread generated more heat than I thought it would, I
basically just wanted to know the reasoning behind making the change to
PHP4, unfortunate I guess for all involved that it went downhill. I
have learned much in the past few days, at any rate.
As mentioned, my code actually broke following the switch to 4.4.0, in
addition to logging hundreds of E_NOTICE errors. It's taken me some
time to track down where it's going wrong, but I think I've found out
the culprits involved. It's complicated, I'll try to explain it all.
The problem was related to components of my web app framework (which is
similar to Struts, and incidently, now being phased out for a MUCH more
lightweight, PHP5-based framework), in particular, an array of
attributes, view helper classes and the creation of DAOs (data access
objects) at runtime via XML configuration, which would look like this:
<daos>
<dao name="dao.freight"
class="FreightDAO"
component="Generic/Commerce/DAO/FreightDAO.php" />
<dao name="dao.customer"
class="CustomerDAO"
component="Generic/Commerce/DAO/CustomerDAO.php" />
<dao name="dao.order.status"
class="OrderStatusDAO"
component="Generic/Commerce/DAO/OrderStatusDAO.php" />
</daos>
This XML would be parsed and the relevant DAO instances would be created
and recorded in attribute scope for the current application module
instance. For each dao node, the following code would be called (where
$daoClass and $daoComponent are extracted from the XML attributes):
$dao =& $this->_createDAO($daoClass,$daoComponent);
if ($dao)
{
$this->module->setAttributeByReference($name,$dao);
}
Notice it assigns by reference, however I discovered that the
_createDAO() method was not *returning* by reference:
function _createDAO($daoClass=null,$daoComponent=null)
{
// Obtain Database Object:
$database =& $this->module->findDatabase();
if (is_null($database))
{
trigger_error($this->error(ERROR_DB_COULD_NOT_OBTAIN));
}
else
{
// Obtain Database Connection:
$connection =& $database->getConnection();
if (is_null($connection))
{
trigger_error($this->error(ERROR_DB_COULD_NOT_CONNECT));
}
else
{
// Create DAO Instance:
$cmp =& new ClassComponent($daoClass,$daoComponent);
$dao =& $cmp->getInstance();
if ($dao)
{
$dao->setConnectionByReference($connection);
return $dao;
}
}
}
return NULL;
}
What was happening under PHP 4.4.0 is when the newly created DAO was
added to the module as an attribute (setAttributeByReference), a new
attribute would be created, but ALL existing DAOs in the attribute scope
would become the newly added DAO, for example:
(create and set the dao.freight attribute):
attributes (array)
{
[dao.freight] => FreightDAO Object
}
(create and set the dao.customer attribute):
attributes (array)
{
[dao.freight] => CustomerDAO Object
[dao.customer] => CustomerDAO Object
}
(create and set the dao.order.status attribute):
attributes (array)
{
[dao.freight] => OrderStatusDAO Object
[dao.customer] => OrderStatusDAO Object
[dao.order.status] => OrderStatusDAO Object
}
Simply by adding the ampersand to the _createDAO() method, like so:
function &_createDAO($daoClass=null,$daoComponent=null)
{
}
...rectified the problem (however did not make hundreds of E_NOTICE's
disappear, of course ;)).
The question is, why did this problem not occur before 4.4.0? Is this
an example of the "memory corruption"?
Regards,
Colin.
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php