Re: [PHP] Class Auto-Assigning to Variable

2013-08-07 Thread Sebastian Krebs
2013/8/7 Brian Smither bhsmit...@gmail.com

 I have a situation where, for some unknown reason, where each class that
 finishes its __contruct{} function, that class gets automatically assigned
 to a variable - other than the variable I specify.

 Conceptually:

 class Hello { private $_world = 'World'; __construct(){} }


This isn't even valid PHP


 $ php -a
Interactive shell

php  class Hello { private $_world = 'World'; __construct(){} }
PHP Parse error:  syntax error, unexpected '__construct' (T_STRING),
expecting function (T_FUNCTION) in php shell code on line 1
php 



 $clsHello = new Hello();

 echo 'The variable $hello is '.gettype($hello).\n.print_r($hello,true);

 Output:
 The variable $hello is object
 Hello Object
 (
 [_world:Hello:private] = World
 )

 There is no statement in my application that assigns an instance of the
 class to another variable, the name being a lowercase variant of the class
 name.

 Would there be a PHP function that would do this as a side-effect?

 I am more interested in learning what is happening as opposed to rolling
 back to a previous version. (A backup copy functions fine. A file compare
 does not reveal any likely suspects.)

 PHP5.4.17-NTS-VC9 (Windows XP-SP3)




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




-- 
github.com/KingCrunch


Re: [PHP] Class Auto-Assigning to Variable

2013-08-07 Thread Brian Smither
Second go around:

I have a situation where, for some unknown reason, where each class that 
finishes its __contruct{} function, that class gets automatically assigned to a 
variable - other than the variable I specify.

Conceptually (a little bit better on the conceptualizing):

class Hello {
private $_world = 'World';
function __construct(){}
}

$clsHello = new Hello();

echo 'The variable $hello is '.gettype($hello).\n.print_r($hello,true);

Output:
The variable $hello is object
Hello Object
(
[_world:Hello:private] = World
)

There is no statement in my application that assigns an instance of the class 
to another variable, the name being a lowercase variant of the class name.

Would there be a PHP function that would do this as a side-effect?

I am more interested in learning what is happening as opposed to rolling back 
to a previous version. (A backup copy functions fine. A file compare does not 
reveal any likely suspects.)

PHP5.4.17-NTS-VC9 (Windows XP-SP3)




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



Re: [PHP] Class Auto-Assigning to Variable

2013-08-07 Thread Ashley Sheridan
On Wed, 2013-08-07 at 13:11 -0600, Brian Smither wrote:

 Second go around:
 
 I have a situation where, for some unknown reason, where each class that 
 finishes its __contruct{} function, that class gets automatically assigned to 
 a variable - other than the variable I specify.
 
 Conceptually (a little bit better on the conceptualizing):
 
 class Hello {
 private $_world = 'World';
 function __construct(){}
 }
 
 $clsHello = new Hello();
 
 echo 'The variable $hello is '.gettype($hello).\n.print_r($hello,true);
 
 Output:
 The variable $hello is object
 Hello Object
 (
 [_world:Hello:private] = World
 )
 
 There is no statement in my application that assigns an instance of the class 
 to another variable, the name being a lowercase variant of the class name.
 
 Would there be a PHP function that would do this as a side-effect?
 
 I am more interested in learning what is happening as opposed to rolling back 
 to a previous version. (A backup copy functions fine. A file compare does not 
 reveal any likely suspects.)
 
 PHP5.4.17-NTS-VC9 (Windows XP-SP3)
 
 
 
 


I cannot replicate this. That code you supplied correctly gives a notice
warning about an undefined variable '$hello'. Are you sure that that
simple code excerpt is giving you the problem you describe and there's
not more to the whole thing, more code, etc?

Thanks,
Ash
http://www.ashleysheridan.co.uk




Re: [PHP] Class Auto-Assigning to Variable

2013-08-07 Thread Brian Smither
I cannot replicate this.

I don't expect anyone to be able to replicate this behavior. The example shows 
an extraordinarily stripped-down sequence of statements that informs what 
should work, but do to some unknown agent, which, therefore, cannot be included 
in the example, produces unexpected output.

This conceptual example is not a 'sample' or 'excerpt' of the actual 
application. There is much, much more code. None of it is an apparent likely 
suspect in causing this behavior.

I am hoping for a, Oh, yeah! I've seen that happen before. It's caused by...

Let us focus on the central question:

Would there be a PHP function that would do [what the example describes] as a 
side-effect?




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



Re: [PHP] Class Auto-Assigning to Variable

2013-08-07 Thread Stuart Dallas
On 7 Aug 2013, at 20:45, Brian Smither bhsmit...@gmail.com wrote:

 I cannot replicate this.
 
 I don't expect anyone to be able to replicate this behavior. The example 
 shows an extraordinarily stripped-down sequence of statements that informs 
 what should work, but do to some unknown agent, which, therefore, cannot be 
 included in the example, produces unexpected output.
 
 This conceptual example is not a 'sample' or 'excerpt' of the actual 
 application. There is much, much more code. None of it is an apparent likely 
 suspect in causing this behavior.
 
 I am hoping for a, Oh, yeah! I've seen that happen before. It's caused by...
 
 Let us focus on the central question:
 
 Would there be a PHP function that would do [what the example describes] as a 
 side-effect?

Yes:

$hello = $clsHello;

There are only a few variables that get assigned as side effects of functions, 
but they have very specific names, and none of them are $hello (but I'm 
guessing that's not the actual variable name) and none of them will assign a 
userland object. Somewhere in your code there is something that is assigning to 
$hello. Find everything that's doing that and look at each instance in detail.

-Stuart

-- 
Stuart Dallas
3ft9 Ltd
http://3ft9.com/

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



Re: [PHP] Class Auto-Assigning to Variable

2013-08-07 Thread Ashley Sheridan
On Wed, 2013-08-07 at 21:02 +0100, Stuart Dallas wrote:

 On 7 Aug 2013, at 20:45, Brian Smither bhsmit...@gmail.com wrote:
 
  I cannot replicate this.
  
  I don't expect anyone to be able to replicate this behavior. The example 
  shows an extraordinarily stripped-down sequence of statements that informs 
  what should work, but do to some unknown agent, which, therefore, cannot be 
  included in the example, produces unexpected output.
  
  This conceptual example is not a 'sample' or 'excerpt' of the actual 
  application. There is much, much more code. None of it is an apparent 
  likely suspect in causing this behavior.
  
  I am hoping for a, Oh, yeah! I've seen that happen before. It's caused 
  by...
  
  Let us focus on the central question:
  
  Would there be a PHP function that would do [what the example describes] as 
  a side-effect?
 
 Yes:
 
 $hello = $clsHello;
 
 There are only a few variables that get assigned as side effects of 
 functions, but they have very specific names, and none of them are $hello 
 (but I'm guessing that's not the actual variable name) and none of them will 
 assign a userland object. Somewhere in your code there is something that is 
 assigning to $hello. Find everything that's doing that and look at each 
 instance in detail.
 
 -Stuart
 
 -- 
 Stuart Dallas
 3ft9 Ltd
 http://3ft9.com/
 


As you've said that your excerpt doesn't replicate the problem, it's not
that useful really to accurately illustrate it. I would say for definite
that it's some of the surrounding code, probably something similar to
this:

class Hello
{
private $_world = 'World';
function __construct(){}

function test()
{
$GLOBALS[strtolower(get_class($this))] = $this;
}
}

$clsHello = new Hello();
$clsHello-test();

echo 'The variable $hello is
'.gettype($hello).\n.print_r($hello,true);


There are probably many ways to achieve this, I can't think of a sane
reason for any of them though!

Thanks,
Ash
http://www.ashleysheridan.co.uk




Re: [PHP] Class Auto-Assigning to Variable

2013-08-07 Thread Brian Smither

 $hello = $clsHello;

If that conceptual statement (or any occurance of the conceptual $hello) were 
in the code, then my (really good) Find feature of my code editor would have 
found it.


 There are only a few variables that get assigned as side effects of
  functions, but they have very specific names, and none of them are
 $hello (but I'm guessing that's not the actual variable name)

I have two dozen classes in this application. In every case, there will be a 
variable, the name of which is a lowercase variant of the class name, to which 
is assigned an instance of the class, when the class's construct() function 
completes. The example informs you of this.


 Somewhere in your code there is something that is assigning to $hello.
 Find everything that's doing that and look at each instance in detail.

I have. Many times. What I am looking for is a side-effect -- something not 
obvious. (This application does not use an eval() function where some 
obfuscated string manipulation would play this out.)


 I would say for definite that it's some of the surrounding code,

Exactly. No sooner and no later than precisely when the class's construct() 
function ends, and control is given to the next statement after the one that 
instantiated that class.


 probably something similar to this:

Let's explore this statement:

 $GLOBALS[strtolower(get_class($this))] = $this;

May I infer that the declaration of $GLOBALS['hello'] will, at the same time, 
also create $hello (without a statement declaring such)?

This:
http://php.net/manual/en/reserved.variables.globals.php
implies the opposite direction.





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



Re: [PHP] Class Auto-Assigning to Variable

2013-08-07 Thread Ashley Sheridan



I have two dozen classes in this application. In every case, there will
be a variable, the name of which is a lowercase variant of the class
name, to which is assigned an instance of the class, when the class's
construct() function completes. The example informs you of this.


Actually, as we've explained, your example does _not_ show this, it works as 
expected and throws a notice, from which can be inferred there is other code 
doing this


 I would say for definite that it's some of the surrounding code,

Exactly. No sooner and no later than precisely when the class's
construct() function ends, and control is given to the next statement
after the one that instantiated that class.


Is your class maybe inheriting from another one and that contains the code 
causing this issue?


 probably something similar to this:

Let's explore this statement:

 $GLOBALS[strtolower(get_class($this))] = $this;

May I infer that the declaration of $GLOBALS['hello'] will, at the same
time, also create $hello (without a statement declaring such)?

The $GLOBALS array is what's known as a super global. Elements within the array 
are reflected as global variables and vice-versa.


This:
http://php.net/manual/en/reserved.variables.globals.php
implies the opposite direction.


Not sure what you mean, but this super global works both ways. Don't 
necessarily get hung up on this being the exact code, it's just a proof of 
concept of how it /might/ be happening. Like I said, there are probably other 
ways too.


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

Thanks,
Ash

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



Re: [PHP] Class Auto-Assigning to Variable

2013-08-07 Thread Brian Smither
Your example does _not_ show this, it works
as expected and throws a notice, from which can be inferred there is other
code doing this

Or relevant code having a side-effect not currently realized.


Is your class maybe inheriting from another one and that contains the code
causing this issue?

No.


May I infer that the declaration of $GLOBALS['hello'] will, at the same
time, also create $hello (without a statement declaring such)?

The $GLOBALS array is what's known as a super global. Elements within the
array are reflected as global variables and vice-versa.


Let's refine the conceptual example:

class Hello {
private $_world = 'World';
function __construct(){}
}

$GLOBALS['hello'] = new Hello();

echo 'The variable $hello is '.gettype($hello).\n.print_r($hello,true);

Can we then postulate that the value of $GLOBALS['hello'] will also be revealed 
in $hello, even though $hello was never formally declared?

I know that $GLOBALS['hello'] has a universal scope, and $hello (wherever it 
comes from) needs to be global-ized inside functions.



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



Re: [PHP] Class Auto-Assigning to Variable

2013-08-07 Thread Ashley Sheridan
On Wed, 2013-08-07 at 19:02 -0600, Brian Smither wrote:

 Your example does _not_ show this, it works
 as expected and throws a notice, from which can be inferred there is other
 code doing this
 
 Or relevant code having a side-effect not currently realized.


No, you just didn't post relevant code.


 
 
 Is your class maybe inheriting from another one and that contains the code
 causing this issue?
 
 No.
 
 
 May I infer that the declaration of $GLOBALS['hello'] will, at the same
 time, also create $hello (without a statement declaring such)?
 
 The $GLOBALS array is what's known as a super global. Elements within the
 array are reflected as global variables and vice-versa.
 
 
 Let's refine the conceptual example:
  
 class Hello {
 private $_world = 'World';
 function __construct(){}
 }
 
 $GLOBALS['hello'] = new Hello();
 
 echo 'The variable $hello is '.gettype($hello).\n.print_r($hello,true);
 
 Can we then postulate that the value of $GLOBALS['hello'] will also be 
 revealed in $hello, even though $hello was never formally declared?
 
 I know that $GLOBALS['hello'] has a universal scope, and $hello (wherever it 
 comes from) needs to be global-ized inside functions.
 


$GLOBALS['hello'] is essentially a synonym for $hello in this context.
$GLOBALS is just an array of all variables that have global scope, so
adding to this causes variables to be added at the global scope level.
But, like I've said a few times, this might not be your specific
problem, and without seeing the actual code that causes this problem,
it's very difficult for anyone to help. Your code examples don't exhibit
the issue you describe, so they're not useful in the context of
pin-pointing the problem. If you can post code that *does* give that
problem, then someone on the list may be able to help.


Thanks,
Ash
http://www.ashleysheridan.co.uk