RE: [PHP] String passed to object constructor turning into an instance of that object?

2010-12-16 Thread Tommy Pham
 -Original Message-
 From: Kris Deugau [mailto:kdeu...@vianet.ca]
 Sent: Thursday, December 16, 2010 11:57 AM
 To: php-general@lists.php.net
 Subject: [PHP] String passed to object constructor turning into an
instance of
 that object?
 
 I'm in the process of migrating customer websites off an old legacy server
 that's pushing EOL, and starting to show hardware failures.
 
 One site is throwing errors on what, so far as I can tell, should be
perfectly
 working code.
 
 The original code works fine on both CentOS 3 (PHP 4.3.2) and CentOS 4
 (4.3.9);  the new server is still a bit outdated (Debian etch plus some
 backports and updates from lenny;  PHP 5.2.0).
 
 The site was designed by staff at a previous hosting company and uses a
 combination of the Fusebox app framework (which seems to work OK, after
 a few relatively minor fixes) and a custom OOP structure.
 
 I'm not really sure what the actual problem is, but I've reached the point
 where this:
 
 
class SelectBoxOption extends Tag {
  function SelectBoxOption($name, $value, $selected=false) {
parent::Tag(option, $name);
$this-addAttribute(value, $value);
if($selected) {
  $this-addAttribute(selected, '', false);
}
 if ($name == ) { echo nbsp;nbsp;nbsp;missing name!br\n; }
 //  else { print nbsp;nbsp;nbsp;name $namebr\n; }
 if ($value == ) { echo nbsp;nbsp;nbsp;missing value!br\n; }
  }
 
 
 will parse and execute, but:
 - the page will contain missing value! for each option in the
 select this is generating
 - it will *not* contain missing name!
 - the option tags in the final output don't have content or value
 (they should have both).
 
 If I uncomment that else, I get:
 
 
 adding option name1 with value1
  name value1
 
   Catchable fatal error: Object of class SelectBoxOption could not be
 converted to string in
 webroot/includes/classes/core/display/form/input/SelectBoxOption.php
 on line 12
 

What's the actual line #12 in the file SelectBoxOption.php?  The
SelectBoxOption code you presented has 11 lines unless it's a CNP error.

Regards,
Tommy

 
 I found the place this object is created, and added some debugging
 output before *and* after that call:
 
 
 echo adding option .$row-$nameField. with .
$row-$valueField.br\n;
 $this-add(new SelectBoxOption($row-$nameField,
   $row-$valueField, $selected));
 echo added option .$row-$nameField. with .
$row-$valueField.br\n;
 
 
 which behaves correctly and spits out the name and value (retrieved from
 a database - thankfully I haven't had to track *that* down... yet).
 
 Can anyone explain why a string passed by value (apparently) would
 suddenly mutate into a SelectBoxOption object?  I've confirmed that this
 is exactly what happens by adding this:
 
 
 if (is_a($name,'SelectBoxOption')) {
print name isn't a SelectBoxOption, silly rabbit!br\n;
 }
 
 
 as the very next set of lines after function SelectBoxOption(.
 
 I wondered while typing this if $name and $value might have ended up as
 special variables somewhere, but renaming them with an opt_ prefix
 didn't change anything.
 
 -kgd
 




-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] String passed to object constructor turning into an instance of that object?

2010-12-16 Thread Kris Deugau

Tommy Pham wrote:

   class SelectBoxOption extends Tag {
 function SelectBoxOption($name, $value, $selected=false) {
   parent::Tag(option, $name);
   $this-addAttribute(value, $value);
   if($selected) {
 $this-addAttribute(selected, '', false);
   }
if ($name == ) { echo nbsp;nbsp;nbsp;missing name!br\n; }
//  else { print nbsp;nbsp;nbsp;name $namebr\n; }
if ($value == ) { echo nbsp;nbsp;nbsp;missing value!br\n; }
 }


will parse and execute, but:
- the page will contain missing value! for each option in the
select this is generating
- it will *not* contain missing name!
- the option tags in the final output don't have content or value
(they should have both).

If I uncomment that else, I get:


adding option name1 with value1
 name value1

  Catchable fatal error: Object of class SelectBoxOption could not be
converted to string in
webroot/includes/classes/core/display/form/input/SelectBoxOption.php
on line 12



What's the actual line #12 in the file SelectBoxOption.php?  The
SelectBoxOption code you presented has 11 lines unless it's a CNP error.


Whups, thought I noted that.  I trimmed a couple of blank lines;  line 
12 in the file is that print in the else.


I found trying to print $name triggers the same error anywhere in that 
function, too;  as I noted further down it seems the string that's 
passed in is getting mutated into an object.  (Whose missing toString 
function is what led me here - but it works fine in PHP 4.3...)


-kgd

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] String passed to object constructor turning into an instance of that object?

2010-12-16 Thread Kris Deugau

Nathan Nobbe wrote:

probly something screwy going on w/ the old style of naming constructors.  2
things,

1. can you post the Tag constructor as it reads now?


function Tag($tag='', $tagContent='') {
  $this-tagContent = $tagContent;
  $this-tag = $tag;
  $this-showEndTag = false;

  $this-attributes = array();
  $this-children = array();
}


2. try modifying Tag  SelectBoxOption to have __construct() instead of
Tag()  SelectBoxOption(), then call parent::__construct() from inside
of SelectBoxOption::__construct(); see if that clears up your problem under
5.2 (read: this will only be a partial solution as it only addresses one
child of Tag).


Mmm.  I hoped this would help, but all it seems to have done was cascade 
errors across the rest of Tag's object children.  :(  Copying the old 
constructor back in resolved that, but I'm not sure whether that 
reintroduces the root problem.


Other objects derived from Tag seem to work just fine;  I came into this 
chunk of the code trying to find out why a SelectBoxOption didn't seem 
to have a toString function - and then why trying to access what should 
be the value and name the same way as with other objects derived at some 
level from Tag blew up instead of working happily.


I'll try converting all of the constructors to your recommendation as 
above, but given that the problem is only happening with this one class, 
I'm not sure that will do much.


(A don't-break-crusty-old-code option for php.ini would be handy...)

The class hierarchy I've dug up so far looks like this (and appears to 
have been entirely defined by the original developer):


Object
  Fieldset
  RadioButtonGroup
  Tag
Column
FormObject
  FormInput
CheckBox
DateSelector
Editor
FileField
FormButton
HiddenField
PasswordField
RadioButton
SelectBox
  PopulatedSelectBox
RecursiveSelectBox
TextArea
TextField
  Form
Row
Table
SelectBoxOption

-kgd

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] String passed to object constructor turning into an instance of that object?

2010-12-16 Thread Nathan Nobbe
On Thu, Dec 16, 2010 at 4:04 PM, Kris Deugau kdeu...@vianet.ca wrote:

 Nathan Nobbe wrote:

 probly something screwy going on w/ the old style of naming constructors.
  2
 things,

 1. can you post the Tag constructor as it reads now?


 function Tag($tag='', $tagContent='') {
  $this-tagContent = $tagContent;
  $this-tag = $tag;
  $this-showEndTag = false;

  $this-attributes = array();
  $this-children = array();

 }


seems innocuous ..



  2. try modifying Tag  SelectBoxOption to have __construct() instead of
 Tag()  SelectBoxOption(), then call parent::__construct() from inside
 of SelectBoxOption::__construct(); see if that clears up your problem
 under
 5.2 (read: this will only be a partial solution as it only addresses one
 child of Tag).


 Mmm.  I hoped this would help, but all it seems to have done was cascade
 errors across the rest of Tag's object children.  :(


to be expected, but did it fix the problem w/ SelectBoxOption?


 Copying the old constructor back in resolved that, but I'm not sure whether
 that reintroduces the root problem.


 Other objects derived from Tag seem to work just fine;  I came into this
 chunk of the code trying to find out why a SelectBoxOption didn't seem to
 have a toString function - and then why trying to access what should be the
 value and name the same way as with other objects derived at some level from
 Tag blew up instead of working happily.

 I'll try converting all of the constructors to your recommendation as
 above, but given that the problem is only happening with this one class, I'm
 not sure that will do much.


hopefully that clears it up .. and hopefully you're using version control :D

-nathan


Re: [PHP] String passed to object constructor turning into an instance of that object?

2010-12-16 Thread David Harkness
I've never used the old-style constructors, but perhaps the semantics of
parent:: changed and you need to instead use $this- as in

$this-Tag(option, $name);

That's a total guess. I don't have 5.2 handy to try it out, but both work in
5.3 using a simple example. Can you post the constructor of one of the Tag
subclasses that work? Maybe we can find a common denominator.

David