How to get value of an private member?

How to get value of an private member?

am 12.09.2007 08:30:05 von Yarco

For example:

class Test
{
private $name = 'yarco';
}

$p = new ReflectionPropery('Test', 'name');
print $p->getValue();

?>

This won't work. See: http://www.php.net/manual/en/language.oop5.reflection.php
==================
Note: Trying to get or set private or protected class property's
values will result in an exception being thrown.
==================
But when we use print_r or var_dump, we could see the private member.
Why reflection doesn't support this?
(We have friend class in c++.)

Re: How to get value of an private member?

am 12.09.2007 14:13:26 von Jerry Stuckle

Yarco wrote:
> For example:
>
> > class Test
> {
> private $name = 'yarco';
> }
>
> $p = new ReflectionPropery('Test', 'name');
> print $p->getValue();
>
> ?>
>
> This won't work. See: http://www.php.net/manual/en/language.oop5.reflection.php
> ==================
> Note: Trying to get or set private or protected class property's
> values will result in an exception being thrown.
> ==================
> But when we use print_r or var_dump, we could see the private member.
> Why reflection doesn't support this?
> (We have friend class in c++.)
>

Because that's the way it works. And there are no friend classes in PHP.

If you want the value of a private variable, you need a non-private
method to get it.

And I suspect the allow print_r() and var_dump() to display the values
because those are debugging aids, while reflection isn't necessarily.

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex@attglobal.net
==================

Re: How to get value of an private member?

am 13.09.2007 06:07:17 von Yarco

But when i think of Reflection, it is a method to view everything in
an object(member's type and value).
If it doesn't support private member, we already have such functions
like get_class_XXX...no need reflection.

On Sep 12, 8:13 pm, Jerry Stuckle wrote:
> Yarco wrote:
> > For example:
>
> > > > class Test
> > {
> > private $name = 'yarco';
> > }
>
> > $p = new ReflectionPropery('Test', 'name');
> > print $p->getValue();
>
> > ?>
>
> > This won't work. See:http://www.php.net/manual/en/language.oop5.reflection.ph p
> > ==================
> > Note: Trying to get or set private or protected class property's
> > values will result in an exception being thrown.
> > ==================
> > But when we use print_r or var_dump, we could see the private member.
> > Why reflection doesn't support this?
> > (We have friend class in c++.)
>
> Because that's the way it works. And there are no friend classes in PHP.
>
> If you want the value of a private variable, you need a non-private
> method to get it.
>
> And I suspect the allow print_r() and var_dump() to display the values
> because those are debugging aids, while reflection isn't necessarily.
>
> --
> ==================
> Remove the "x" from my email address
> Jerry Stuckle
> JDS Computer Training Corp.
> jstuck...@attglobal.net
> ==================

Re: How to get value of an private member?

am 13.09.2007 07:41:24 von Steve

"Yarco" wrote in message
news:1189656437.305893.202070@r34g2000hsd.googlegroups.com.. .
> But when i think of Reflection, it is a method to view everything in
> an object(member's type and value).
> If it doesn't support private member, we already have such functions
> like get_class_XXX...no need reflection.

well, your reflection on Reflection is limited to how oop is supported in
the language you're using. reflection in php is very limited. you can work
around this of course. the only time you can't get the variables and their
respective values is when a class is static and it does not give a means to
get it's instance. otherwise, you can turn the class object's instance into
a string and parse it. this does not give you the ability to do anything to
it's data, but that is not the question at hand.

$object = new Something();
$objectAsString = print_r($object, true);
// code to parse the string version of $object here
// code to do with that information what you will here

php lacks a ton of oop features liked shared interfaces (like a shared
constructor, which is nifty), friend interfaces, nested classes, etc.. maybe
later they'll all be added inclusive of better reflection, but for now
you'll just have to make do.

Re: How to get value of an private member?

am 13.09.2007 13:27:41 von Jerry Stuckle

Yarco wrote:
> On Sep 12, 8:13 pm, Jerry Stuckle wrote:
>> Yarco wrote:
>>> For example:
>>> >>> class Test
>>> {
>>> private $name = 'yarco';
>>> }
>>> $p = new ReflectionPropery('Test', 'name');
>>> print $p->getValue();
>>> ?>
>>> This won't work. See:http://www.php.net/manual/en/language.oop5.reflection.ph p
>>> ==================
>>> Note: Trying to get or set private or protected class property's
>>> values will result in an exception being thrown.
>>> ==================
>>> But when we use print_r or var_dump, we could see the private member.
>>> Why reflection doesn't support this?
>>> (We have friend class in c++.)
>> Because that's the way it works. And there are no friend classes in PHP.
>>
>> If you want the value of a private variable, you need a non-private
>> method to get it.
>>
>> And I suspect the allow print_r() and var_dump() to display the values
>> because those are debugging aids, while reflection isn't necessarily.
>>
> But when i think of Reflection, it is a method to view everything in
> an object(member's type and value).
> If it doesn't support private member, we already have such functions
> like get_class_XXX...no need reflection.
>

(Top posting fixed)

That's not what reflection is in OO design. PHP has it right.
Reflection allows you to look at a class and see what is *publicly*
available. It is not meant to break encapsulation.

P.S. Please don't top post. Thanks.

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex@attglobal.net
==================

Re: How to get value of an private member?

am 17.09.2007 10:34:14 von Yarco

I think steve is right.
But i don't agree with Jerry:
> Reflection allows you to look at a class and see what is *publicly*
> available. It is not meant to break encapsulation.
Reflection should access private members.Or we won't need such a core
feature in php.

On Sep 13, 7:27 pm, Jerry Stuckle wrote:
> Yarco wrote:
> > On Sep 12, 8:13 pm, Jerry Stuckle wrote:
> >> Yarco wrote:
> >>> For example:
> >>> > >>> class Test
> >>> {
> >>> private $name = 'yarco';
> >>> }
> >>> $p = new ReflectionPropery('Test', 'name');
> >>> print $p->getValue();
> >>> ?>
> >>> This won't work. See:http://www.php.net/manual/en/language.oop5.reflection.ph p
> >>> ==================
> >>> Note: Trying to get or set private or protected class property's
> >>> values will result in an exception being thrown.
> >>> ==================
> >>> But when we use print_r or var_dump, we could see the private member.
> >>> Why reflection doesn't support this?
> >>> (We have friend class in c++.)
> >> Because that's the way it works. And there are no friend classes in PHP.
>
> >> If you want the value of a private variable, you need a non-private
> >> method to get it.
>
> >> And I suspect the allow print_r() and var_dump() to display the values
> >> because those are debugging aids, while reflection isn't necessarily.
>
> > But when i think of Reflection, it is a method to view everything in
> > an object(member's type and value).
> > If it doesn't support private member, we already have such functions
> > like get_class_XXX...no need reflection.
> >
>
> (Top posting fixed)
>
> That's not what reflection is in OO design. PHP has it right.
> Reflection allows you to look at a class and see what is *publicly*
> available. It is not meant to break encapsulation.
>
> P.S. Please don't top post. Thanks.
>
> --
> ==================
> Remove the "x" from my email address
> Jerry Stuckle
> JDS Computer Training Corp.
> jstuck...@attglobal.net
> ==================

Re: How to get value of an private member?

am 17.09.2007 10:37:30 von Yarco

BTW, what's top post? I reply this on google. Can't see any button
related to this feature.

On Sep 13, 7:27 pm, Jerry Stuckle wrote:
> Yarco wrote:
> > On Sep 12, 8:13 pm, Jerry Stuckle wrote:
> >> Yarco wrote:
> >>> For example:
> >>> > >>> class Test
> >>> {
> >>> private $name = 'yarco';
> >>> }
> >>> $p = new ReflectionPropery('Test', 'name');
> >>> print $p->getValue();
> >>> ?>
> >>> This won't work. See:http://www.php.net/manual/en/language.oop5.reflection.ph p
> >>> ==================
> >>> Note: Trying to get or set private or protected class property's
> >>> values will result in an exception being thrown.
> >>> ==================
> >>> But when we use print_r or var_dump, we could see the private member.
> >>> Why reflection doesn't support this?
> >>> (We have friend class in c++.)
> >> Because that's the way it works. And there are no friend classes in PHP.
>
> >> If you want the value of a private variable, you need a non-private
> >> method to get it.
>
> >> And I suspect the allow print_r() and var_dump() to display the values
> >> because those are debugging aids, while reflection isn't necessarily.
>
> > But when i think of Reflection, it is a method to view everything in
> > an object(member's type and value).
> > If it doesn't support private member, we already have such functions
> > like get_class_XXX...no need reflection.
> >
>
> (Top posting fixed)
>
> That's not what reflection is in OO design. PHP has it right.
> Reflection allows you to look at a class and see what is *publicly*
> available. It is not meant to break encapsulation.
>
> P.S. Please don't top post. Thanks.
>
> --
> ==================
> Remove the "x" from my email address
> Jerry Stuckle
> JDS Computer Training Corp.
> jstuck...@attglobal.net
> ==================

Re: How to get value of an private member?

am 17.09.2007 10:44:15 von Bucky Kaufman

Yarco wrote:
> BTW, what's top post? I reply this on google. Can't see any button
> related to this feature.

Google groups is just a front-end for usenet.
Normally, folks use Thunderbird or Outlook Express to access usenet.

Messages like yours, posted from Google Groups appear somewhat
upside-down when viewed outside of google.

Re: How to get value of an private member?

am 17.09.2007 13:56:10 von Jerry Stuckle

Yarco wrote:
> On Sep 13, 7:27 pm, Jerry Stuckle wrote:
>> Yarco wrote:
>>> On Sep 12, 8:13 pm, Jerry Stuckle wrote:
>>>> Yarco wrote:
>>>>> For example:
>>>>> >>>>> class Test
>>>>> {
>>>>> private $name = 'yarco';
>>>>> }
>>>>> $p = new ReflectionPropery('Test', 'name');
>>>>> print $p->getValue();
>>>>> ?>
>>>>> This won't work. See:http://www.php.net/manual/en/language.oop5.reflection.ph p
>>>>> ==================
>>>>> Note: Trying to get or set private or protected class property's
>>>>> values will result in an exception being thrown.
>>>>> ==================
>>>>> But when we use print_r or var_dump, we could see the private member.
>>>>> Why reflection doesn't support this?
>>>>> (We have friend class in c++.)
>>>> Because that's the way it works. And there are no friend classes in PHP.
>>>> If you want the value of a private variable, you need a non-private
>>>> method to get it.
>>>> And I suspect the allow print_r() and var_dump() to display the values
>>>> because those are debugging aids, while reflection isn't necessarily.
>> > But when i think of Reflection, it is a method to view everything in
>> > an object(member's type and value).
>> > If it doesn't support private member, we already have such functions
>> > like get_class_XXX...no need reflection.
>> >
>>
>> (Top posting fixed)
>>
>> That's not what reflection is in OO design. PHP has it right.
>> Reflection allows you to look at a class and see what is *publicly*
>> available. It is not meant to break encapsulation.
>>
>> P.S. Please don't top post. Thanks.
>>
>> --
>> ==================
>> Remove the "x" from my email address
>> Jerry Stuckle
>> JDS Computer Training Corp.
>> jstuck...@attglobal.net
>> ==================
>
>

> I think steve is right.
> But i don't agree with Jerry:
>> Reflection allows you to look at a class and see what is *publicly*
>> available. It is not meant to break encapsulation.
> Reflection should access private members.Or we won't need such a core
> feature in php.
>
(top posting fixed)

No, encapsulation is one of the basic tenets of both Object Based and
Object Oriented programming. Properly implemented, it provides
protection for those members of the class.

Reflection is not meant to be a way to break that tenet. Rather, it is
a way to discover the *publicly available* members. To allow reflection
to access private members would break that tenet and potentially cause
problems OO is designed to prevent. This is true in all OO languages
where reflections is available.

So, whether you agree with me or not is immaterial. The way it is
implemented in PHP matches OO concepts and other languages where
reflection is used.

Also, top posting is posting your message before the message you're
replying to. This newsgroup (and most of usenet) posts responses after
the message they are responding to.

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex@attglobal.net
==================

Re: How to get value of an private member?

am 17.09.2007 18:36:08 von Yarco

You are talking something related to pure OO.
In my eyes, php4 just look like c, and php5 look like c++. And i like c
++. Because no strict rule said you did it right or wrong.
OO is designed to prevent access to the private members, but not
saying we don't need to access that in sometimes. That's why c++ need
friend class/function i think.
If reflection is only a way to discover the public members, it could
be designed as a php class(in phplib or zend framework).
So it should do something that you can't use php function to do in
that it is done in c.(That is accessing private members.)

On Sep 17, 7:56 pm, Jerry Stuckle wrote:
> Yarco wrote:
> > On Sep 13, 7:27 pm, Jerry Stuckle wrote:
> >> Yarco wrote:
> >>> On Sep 12, 8:13 pm, Jerry Stuckle wrote:
> >>>> Yarco wrote:
> >>>>> For example:
> >>>>> > >>>>> class Test
> >>>>> {
> >>>>> private $name = 'yarco';
> >>>>> }
> >>>>> $p = new ReflectionPropery('Test', 'name');
> >>>>> print $p->getValue();
> >>>>> ?>
> >>>>> This won't work. See:http://www.php.net/manual/en/language.oop5.reflection.ph p
> >>>>> ==================
> >>>>> Note: Trying to get or set private or protected class property's
> >>>>> values will result in an exception being thrown.
> >>>>> ==================
> >>>>> But when we use print_r or var_dump, we could see the private member.
> >>>>> Why reflection doesn't support this?
> >>>>> (We have friend class in c++.)
> >>>> Because that's the way it works. And there are no friend classes in PHP.
> >>>> If you want the value of a private variable, you need a non-private
> >>>> method to get it.
> >>>> And I suspect the allow print_r() and var_dump() to display the values
> >>>> because those are debugging aids, while reflection isn't necessarily.
> >> > But when i think of Reflection, it is a method to view everything in
> >> > an object(member's type and value).
> >> > If it doesn't support private member, we already have such functions
> >> > like get_class_XXX...no need reflection.
>
> >> (Top posting fixed)
>
> >> That's not what reflection is in OO design. PHP has it right.
> >> Reflection allows you to look at a class and see what is *publicly*
> >> available. It is not meant to break encapsulation.
>
> >> P.S. Please don't top post. Thanks.
>
> >> --
> >> ==================
> >> Remove the "x" from my email address
> >> Jerry Stuckle
> >> JDS Computer Training Corp.
> >> jstuck...@attglobal.net
> >> ==================
>
> > I think steve is right.
> > But i don't agree with Jerry:
> >> Reflection allows you to look at a class and see what is *publicly*
> >> available. It is not meant to break encapsulation.
> > Reflection should access private members.Or we won't need such a core
> > feature in php.
> >
> (top posting fixed)
>
> No, encapsulation is one of the basic tenets of both Object Based and
> Object Oriented programming. Properly implemented, it provides
> protection for those members of the class.
>
> Reflection is not meant to be a way to break that tenet. Rather, it is
> a way to discover the *publicly available* members. To allow reflection
> to access private members would break that tenet and potentially cause
> problems OO is designed to prevent. This is true in all OO languages
> where reflections is available.
>
> So, whether you agree with me or not is immaterial. The way it is
> implemented in PHP matches OO concepts and other languages where
> reflection is used.
>
> Also, top posting is posting your message before the message you're
> replying to. This newsgroup (and most of usenet) posts responses after
> the message they are responding to.
>
> --
> ==================
> Remove the "x" from my email address
> Jerry Stuckle
> JDS Computer Training Corp.
> jstuck...@attglobal.net
> ==================

Re: How to get value of an private member?

am 17.09.2007 18:58:58 von Steve

"Yarco" wrote in message
news:1190046968.950571.58500@50g2000hsm.googlegroups.com...
> You are talking something related to pure OO.
> In my eyes, php4 just look like c, and php5 look like c++. And i like c
> ++. Because no strict rule said you did it right or wrong.
> OO is designed to prevent access to the private members, but not
> saying we don't need to access that in sometimes. That's why c++ need
> friend class/function i think.
> If reflection is only a way to discover the public members, it could
> be designed as a php class(in phplib or zend framework).
> So it should do something that you can't use php function to do in
> that it is done in c.(That is accessing private members.)

ummm...php 3 (which has oop capabilities too) and php 5 are cosmetically
*identicle*...they both look like a scripting language resembling c (like a
lot other scripting languages). anyway...

the ONLY time reflection allows you to change a private member of a class
object is when the caller is within appropriate scope...i.e. friend or
subordinate/nested class. outside of that, reflection NEVER acts as you
intend, even in c++. jerry is correct. and, as php doesn't support friend or
nested classes, you are sol. sorry. you are limited to hacking to get values
of variables that are private...this leaves out, entirely, the possibility
of discovering 'hidden' interfaces/methods that should remain
encapsulated...i.e. private. the only other hack i haven't tried is to
inherit from the object you're trying to hack and then reflecting on the
base object from there. that may be your workaround for those interfaces.

btw, what are you trying to accomplish?

Re: How to get value of an private member?

am 18.09.2007 03:32:54 von Jerry Stuckle

Yarco wrote:
> You are talking something related to pure OO.
> In my eyes, php4 just look like c, and php5 look like c++. And i like c
> ++. Because no strict rule said you did it right or wrong.
> OO is designed to prevent access to the private members, but not
> saying we don't need to access that in sometimes. That's why c++ need
> friend class/function i think.
> If reflection is only a way to discover the public members, it could
> be designed as a php class(in phplib or zend framework).
> So it should do something that you can't use php function to do in
> that it is done in c.(That is accessing private members.)
>
> On Sep 17, 7:56 pm, Jerry Stuckle wrote:
>> Yarco wrote:
>>> On Sep 13, 7:27 pm, Jerry Stuckle wrote:
>>>> Yarco wrote:
>>>>> On Sep 12, 8:13 pm, Jerry Stuckle wrote:
>>>>>> Yarco wrote:
>>>>>>> For example:
>>>>>>> >>>>>>> class Test
>>>>>>> {
>>>>>>> private $name = 'yarco';
>>>>>>> }
>>>>>>> $p = new ReflectionPropery('Test', 'name');
>>>>>>> print $p->getValue();
>>>>>>> ?>
>>>>>>> This won't work. See:http://www.php.net/manual/en/language.oop5.reflection.ph p
>>>>>>> ==================
>>>>>>> Note: Trying to get or set private or protected class property's
>>>>>>> values will result in an exception being thrown.
>>>>>>> ==================
>>>>>>> But when we use print_r or var_dump, we could see the private member.
>>>>>>> Why reflection doesn't support this?
>>>>>>> (We have friend class in c++.)
>>>>>> Because that's the way it works. And there are no friend classes in PHP.
>>>>>> If you want the value of a private variable, you need a non-private
>>>>>> method to get it.
>>>>>> And I suspect the allow print_r() and var_dump() to display the values
>>>>>> because those are debugging aids, while reflection isn't necessarily.
>>>> > But when i think of Reflection, it is a method to view everything in
>>>> > an object(member's type and value).
>>>> > If it doesn't support private member, we already have such functions
>>>> > like get_class_XXX...no need reflection.
>>>> (Top posting fixed)
>>>> That's not what reflection is in OO design. PHP has it right.
>>>> Reflection allows you to look at a class and see what is *publicly*
>>>> available. It is not meant to break encapsulation.
>>>> P.S. Please don't top post. Thanks.
>>>> --
>>>> ==================
>>>> Remove the "x" from my email address
>>>> Jerry Stuckle
>>>> JDS Computer Training Corp.
>>>> jstuck...@attglobal.net
>>>> ==================
>> > I think steve is right.
>> > But i don't agree with Jerry:
>> >> Reflection allows you to look at a class and see what is *publicly*
>> >> available. It is not meant to break encapsulation.
>> > Reflection should access private members.Or we won't need such a core
>> > feature in php.
>> >
>> (top posting fixed)
>>
>> No, encapsulation is one of the basic tenets of both Object Based and
>> Object Oriented programming. Properly implemented, it provides
>> protection for those members of the class.
>>
>> Reflection is not meant to be a way to break that tenet. Rather, it is
>> a way to discover the *publicly available* members. To allow reflection
>> to access private members would break that tenet and potentially cause
>> problems OO is designed to prevent. This is true in all OO languages
>> where reflections is available.
>>
>> So, whether you agree with me or not is immaterial. The way it is
>> implemented in PHP matches OO concepts and other languages where
>> reflection is used.
>>
>> Also, top posting is posting your message before the message you're
>> replying to. This newsgroup (and most of usenet) posts responses after
>> the message they are responding to.
>>
>> --
>> ==================
>> Remove the "x" from my email address
>> Jerry Stuckle
>> JDS Computer Training Corp.
>> jstuck...@attglobal.net
>> ==================
>
>
You are talking something related to pure OO.
In my eyes, php4 just look like c, and php5 look like c++. And i like c
++. Because no strict rule said you did it right or wrong.
OO is designed to prevent access to the private members, but not
saying we don't need to access that in sometimes. That's why c++ need
friend class/function i think.
If reflection is only a way to discover the public members, it could
be designed as a php class(in phplib or zend framework).
So it should do something that you can't use php function to do in
that it is done in c.(That is accessing private members.)

(Top posting fixed again)

No, PHP 4 is also OO - not as much as PHP5, but still OO. And private
members how encapsulation is implemented, which is strictly object based
or object oriented.

C, for instance, has no "public", "private" or "protected" keywords.
C++ does. So does Java.

If you need that access, you need to create accessor functions.
Reflection will not do it for you. And yes, C++ does have friend
classes and functions - but even Bjorn Stroustrop admits they are a
"necessary evil" - not a choice.

So, reflection is only a means of discovering public members. And since
C doesn't have private members, reflection doesn't find private members.
In fact, since C doesn't even have classes, there is nothing for
reflection to do - it is not applicable in C.

And once again, please don't top post. If you continue top posting, you
will generally find yourself persona not grata in this newsgroup.

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex@attglobal.net
==================