Globalizing vars in class methods doesnt seem to work, var disappears after global, var is inaccessible in other methods/funcs [message #178789] |
Fri, 03 August 2012 17:45 |
J. Frank Parnell
Messages: 12 Registered: January 2012
Karma: 0
|
Junior Member |
|
|
<?php
class test{
function __construct(){
$this->makevar();
global $var;
echo '<hr>__const(): '.$var;
}
function makevar(){
$var = 'something';
echo '<hr>just declared in makevar(): '.$var;
global $var;
echo '<hr>after global in makevar(): '.$var;
}
}//class
$t = new test;
echo '<hr>outside class: '.$var;
global $var;
echo '<hr>outside class after global: '.$var;
?>
this outputs:
just declared in makevar(): something
after global in makevar(): [nothing]
__const():[nothing]
outside class: [nothing]
outside class after global: [nothing]
So, 1, why does global $var in the makevar() make it null?
and B, why dont I have any access to $var in the __constructor or outside the class?
In the real script, $var will be an instance of a different class that I want to use all over the place.
thanks, J
|
|
|
Re: Globalizing vars in class methods doesnt seem to work, var disappears after global, var is inaccessible in other methods/funcs [message #178792 is a reply to message #178789] |
Sat, 04 August 2012 17:18 |
M. Strobel
Messages: 386 Registered: December 2011
Karma: 0
|
Senior Member |
|
|
Am 03.08.2012 19:45, schrieb J. Frank Parnell:
> <?php
> class test{
> function __construct(){
> $this->makevar();
> global $var;
> echo '<hr>__const(): '.$var;
> }
> function makevar(){
> $var = 'something';
> echo '<hr>just declared in makevar(): '.$var;
> global $var;
> echo '<hr>after global in makevar(): '.$var;
> }
> }//class
>
> $t = new test;
> echo '<hr>outside class: '.$var;
> global $var;
> echo '<hr>outside class after global: '.$var;
>
> ?>
> this outputs:
> just declared in makevar(): something
> after global in makevar(): [nothing]
> __const():[nothing]
> outside class: [nothing]
> outside class after global: [nothing]
>
>
> So, 1, why does global $var in the makevar() make it null?
> and B, why dont I have any access to $var in the __constructor or outside the class?
>
Your code is nonsense, you have to declare a variable as global _before_ using it.
> In the real script, $var will be an instance of a different class that I want to use all over the place.
>
Have a look at the singleton pattern.
/Str.
|
|
|
Re: Globalizing vars in class methods doesnt seem to work, var disappears after global, var is inaccessible in other methods/funcs [message #178793 is a reply to message #178789] |
Sat, 04 August 2012 18:24 |
Jerry Stuckle
Messages: 2598 Registered: September 2010
Karma: 0
|
Senior Member |
|
|
On 8/3/2012 1:45 PM, J. Frank Parnell wrote:
> <?php
> class test{
> function __construct(){
> $this->makevar();
> global $var;
> echo '<hr>__const(): '.$var;
> }
> function makevar(){
> $var = 'something';
> echo '<hr>just declared in makevar(): '.$var;
> global $var;
> echo '<hr>after global in makevar(): '.$var;
> }
> }//class
>
> $t = new test;
> echo '<hr>outside class: '.$var;
> global $var;
> echo '<hr>outside class after global: '.$var;
>
> ?>
> this outputs:
> just declared in makevar(): something
> after global in makevar(): [nothing]
> __const():[nothing]
> outside class: [nothing]
> outside class after global: [nothing]
>
>
> So, 1, why does global $var in the makevar() make it null?
> and B, why dont I have any access to $var in the __constructor or outside the class?
>
> In the real script, $var will be an instance of a different class that I want to use all over the place.
>
> thanks, J
>
And what if you have:
$t1 = new test;
$t2 = new test;
Which variable are you supposed to be referencing (they are two
different variables)?
But what you're doing violates several concepts in OO programming,
including encapsulation and message passing. The correct way to do it
is to pass an object of the class as a parameter (i.e. to the
constructor) then use getters and setters to reference the variable.
Proper coding makes your code more reliable, maintainable, reusable and
easier to understand.
--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex(at)attglobal(dot)net
==================
|
|
|
Re: Globalizing vars in class methods doesnt seem to work, var disappears after global, var is inaccessible in other methods/funcs [message #178794 is a reply to message #178793] |
Sat, 04 August 2012 18:45 |
Jerry Stuckle
Messages: 2598 Registered: September 2010
Karma: 0
|
Senior Member |
|
|
On 8/4/2012 2:24 PM, Jerry Stuckle wrote:
> On 8/3/2012 1:45 PM, J. Frank Parnell wrote:
>> <?php
>> class test{
>> function __construct(){
>> $this->makevar();
>> global $var;
>> echo '<hr>__const(): '.$var;
>> }
>> function makevar(){
>> $var = 'something';
>> echo '<hr>just declared in makevar(): '.$var;
>> global $var;
>> echo '<hr>after global in makevar(): '.$var;
>> }
>> }//class
>>
>> $t = new test;
>> echo '<hr>outside class: '.$var;
>> global $var;
>> echo '<hr>outside class after global: '.$var;
>>
>> ?>
>> this outputs:
>> just declared in makevar(): something
>> after global in makevar(): [nothing]
>> __const():[nothing]
>> outside class: [nothing]
>> outside class after global: [nothing]
>>
>>
>> So, 1, why does global $var in the makevar() make it null?
>> and B, why dont I have any access to $var in the __constructor or
>> outside the class?
>>
>> In the real script, $var will be an instance of a different class that
>> I want to use all over the place.
>>
>> thanks, J
>>
>
> And what if you have:
>
> $t1 = new test;
> $t2 = new test;
>
> Which variable are you supposed to be referencing (they are two
> different variables)?
>
> But what you're doing violates several concepts in OO programming,
> including encapsulation and message passing. The correct way to do it
> is to pass an object of the class as a parameter (i.e. to the
> constructor) then use getters and setters to reference the variable.
> Proper coding makes your code more reliable, maintainable, reusable and
> easier to understand.
>
An addition option I forgot to mention - you could also use the
singleton pattern as M. Strobel referenced. However, if you do, you
should always have a default parameter in the call so you can use
something other than the singleton when you need to.
--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex(at)attglobal(dot)net
==================
|
|
|
Re: Globalizing vars in class methods doesnt seem to work, var disappears after global, var is inaccessible in other methods/funcs [message #178795 is a reply to message #178794] |
Sun, 05 August 2012 04:08 |
J. Frank Parnell
Messages: 12 Registered: January 2012
Karma: 0
|
Junior Member |
|
|
On Saturday, August 4, 2012 11:45:35 AM UTC-7, Jerry Stuckle wrote:
> On 8/4/2012 2:24 PM, Jerry Stuckle wrote:
>
>> On 8/3/2012 1:45 PM, J. Frank Parnell wrote:
>
>>> <?php
>
>>> class test{
>
>>> function __construct(){
>
>>> $this->makevar();
>
>>> global $var;
>
>>> echo '<hr>__const(): '.$var;
>
>>> }
>
>>> function makevar(){
>
>>> $var = 'something';
>
>>> echo '<hr>just declared in makevar(): '.$var;
>
>>> global $var;
>
>>> echo '<hr>after global in makevar(): '.$var;
>
>>> }
>
>>> }//class
>
>>>
>
>>> $t = new test;
>
>>> echo '<hr>outside class: '.$var;
>
>>> global $var;
>
>>> echo '<hr>outside class after global: '.$var;
>
>>>
>
>>> ?>
>
>>> this outputs:
>
>>> just declared in makevar(): something
>
>>> after global in makevar(): [nothing]
>
>>> __const():[nothing]
>
>>> outside class: [nothing]
>
>>> outside class after global: [nothing]
>
>>>
>
>>>
>
>>> So, 1, why does global $var in the makevar() make it null?
>
>>> and B, why dont I have any access to $var in the __constructor or
>
>>> outside the class?
>
>>>
>
>>> In the real script, $var will be an instance of a different class that
>
>>> I want to use all over the place.
>
>>> thanks, J
>
>>>
>
>>
>
>> And what if you have:
>
>>
>
>> $t1 = new test;
>
>> $t2 = new test;
>
>>
>
>> Which variable are you supposed to be referencing (they are two
>
>> different variables)?
>
>>
>
>> But what you're doing violates several concepts in OO programming,
>
>> including encapsulation and message passing. The correct way to do it
>
>> is to pass an object of the class as a parameter (i.e. to the
>
>> constructor) then use getters and setters to reference the variable.
>
>> Proper coding makes your code more reliable, maintainable, reusable and
>
>> easier to understand.
>
>>
>
>
>
> An addition option I forgot to mention - you could also use the
>
> singleton pattern as M. Strobel referenced. However, if you do, you
>
> should always have a default parameter in the call so you can use
>
> something other than the singleton when you need to.
Ok, I read a little on the singleton, that does seem like a good way of doing it. What I wound up doing, before you guys replied, was just $this->var = 'something' and then doing $t->var where I needed that 'something'. Which I think make sense for OO? Because it is somewhat logical for 'something' to be part of my class, in my situation. Although 'something' is a different object, eg, an api class. My class is a child class of a controller in an MVCish framework.
I just found out that this works
class test{
function __construct(){
$this->makevar();
}
function makevar(){
global $var;
$var = 'something';// actually, $var = new something();
}
}//class
$t = new test;
echo '<hr>outside class: '.$var;//works And I assume would work in a unrelated function if I globalled it in there.
> always have a default parameter in the call so you can use
> something other than the singleton when you need to
not sure what this means
|
|
|
Re: Globalizing vars in class methods doesnt seem to work, var disappears after global, var is inaccessible in other methods/funcs [message #178796 is a reply to message #178795] |
Sun, 05 August 2012 06:28 |
J.O. Aho
Messages: 194 Registered: September 2010
Karma: 0
|
Senior Member |
|
|
On 05/08/12 06:08, J. Frank Parnell wrote:
> On Saturday, August 4, 2012 11:45:35 AM UTC-7, Jerry Stuckle wrote:
>> On 8/4/2012 2:24 PM, Jerry Stuckle wrote:
>
>>
>> An addition option I forgot to mention - you could also use the
>>
>> singleton pattern as M. Strobel referenced. However, if you do, you
>>
>> should always have a default parameter in the call so you can use
>>
>> something other than the singleton when you need to.
>
> Ok, I read a little on the singleton, that does seem like a good way of doing it. What I wound up doing, before you guys replied, was just $this->var = 'something' and then doing $t->var where I needed that 'something'. Which I think make sense for OO? Because it is somewhat logical for 'something' to be part of my class, in my situation. Although 'something' is a different object, eg, an api class. My class is a child class of a controller in an MVCish framework.
>
> I just found out that this works
> class test{
> function __construct(){
> $this->makevar();
> }
> function makevar(){
> global $var;
> $var = 'something';// actually, $var = new something();
> }
> }//class
>
> $t = new test;
> echo '<hr>outside class: '.$var;//works And I assume would work in a unrelated function if I globalled it in there.
>
>> always have a default parameter in the call so you can use
>> something other than the singleton when you need to
>
> not sure what this means
class test {
private $var = null;
function __construct($invalue = null) {
$this->var = $invalue;
}
}
IMHO it's better to have functions if you want to manipulate values in a
class, there are many ways to do it, but the simplest would just be:
function getVar() {
return $this->var;
}
function setVar($invalue) {
// verify that the input is of the right form
// then update the value
$this->var = $invalue;
}
--
//Aho
|
|
|