FUDforum
Fast Uncompromising Discussions. FUDforum will get your users talking.

Home » Imported messages » comp.lang.php » Globalizing vars in class methods doesnt seem to work, var disappears after global, var is inaccessible in other methods/funcs
Show: Today's Messages :: Polls :: Message Navigator
Switch to threaded view of this topic Create a new topic Submit Reply
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 Go to next message
J. Frank Parnell is currently offline  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 Go to previous messageGo to next message
M. Strobel is currently offline  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 Go to previous messageGo to next message
Jerry Stuckle is currently offline  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 Go to previous messageGo to next message
Jerry Stuckle is currently offline  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 Go to previous messageGo to next message
J. Frank Parnell is currently offline  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 Go to previous message
J.O. Aho is currently offline  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
  Switch to threaded view of this topic Create a new topic Submit Reply
Previous Topic: str_replace, replace array with string AND array
Next Topic: Excellent new opportunity for developers to monetize more with their Apps.
Goto Forum:
  

-=] Back to Top [=-
[ Syndicate this forum (XML) ] [ RSS ]

Current Time: Fri Nov 22 02:22:28 GMT 2024

Total time taken to generate the page: 0.02572 seconds