Re: non static function called as static one
| From: | Nathan Nobbe | Date: | Wed, 11 Mar 2009 23:05:40 +0000 |
| Subject: | Re: non static function called as static one | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-43328@lists.php.net to get a copy of this message | ||
On Wed, Mar 11, 2009 at 4:40 PM, Olivier Doucet <webmaster@ajeux.com> wrote:
> Hi,
>
>
>> not sure if this was mentioned on the general list but, i believe what
>> youre describing is documented in the manual under php5 classes/objects ->
>> "the basics":
>>
>> http://www.php.net/manual/en/language.oop5.basic.php
>>
>> $this is a reference to the calling object (usually the object to which
>> the method belongs, but can be another object, if the method is called
>> statically
>> <http://www.php.net/manual/en/language.oop5.static.php> from
>> the context of a secondary object).
>>
>> -nathan
>>
> I know this behaviour is fully documented, but I was more concerned about
> "is it a 'normal' behaviour ?". How can a programmer controls the class he
> wrote, and make it absolutely bugproof ? How can he detect his function was
> called in a static context and forbid it (or write specific code for) ?
>
well, the access to $this of the secondary object is limited. so the only
way it really does anything useful is if member variables you wish to access
are marked as public; making it mostly useless imo.. but anyway all youd
need to do is mark member vars as protected or private. (personally, i think
it should be able to access protected vars, since the class which invokes
the other statically is essentially sanctioning access to its instance
variables).
<?php
class A {
public function showOtherClassInstanceVar($varname) {
var_dump($this->$varname);
}
}
class B {
public $a = 1;
protected $b = 2;
private $c = 3;
public function dumpViaMixin() {
A::showOtherClassInstanceVar('a');
A::showOtherClassInstanceVar('b');
A::showOtherClassInstanceVar('c');
}
}
$b = new B();
$b->dumpViaMixin();
---
outputs
int(1)
then the error log shows,
[11-Mar-2009 17:01:03] PHP Fatal error: Cannot access protected property
B::$b in /Users/nnobbe/testDelegation.php on line 5
[11-Mar-2009 17:01:03] PHP Stack trace:
[11-Mar-2009 17:01:03] PHP 1. {main}() /Users/nnobbe/testDelegation.php:0
[11-Mar-2009 17:01:03] PHP 2. B->dumpViaMixin()
/Users/nnobbe/testDelegation.php:22
[11-Mar-2009 17:01:03] PHP 3. A->showOtherClassInstanceVar()
/Users/nnobbe/testDelegation.php:16
so you should be able to protect your classes w/o too much trouble.
-nathan