Re: Private member/method access inconsistency

From: Date: Thu, 08 Jan 2009 17:00:06 +0000
Subject: Re: Private member/method access inconsistency
References: 1 2  Groups: php.internals 
Request: Send a blank email to internals+get-42537@lists.php.net to get a copy of this message
2009/1/6 David Coallier <davidc@php.net>: >> call to __call() on private method invocation. The former approach presents >> more of a BC >> problem IMHO, so I am advocating the latter. I've attached a simple patch >> for consideration. >> > > I'd say go ahead, this sounds like common sense to be consistent in > both methods and members. > Cool, looks like this has gone in already. A couple of comments: 1. I think the change has not been made for callbacks (so callbacks now behave differently from normal method invocations). 2. Perhaps on 5_3 and HEAD, the equivalent change should be made for __callStatic()? Addressing those two points would make things even more consistent. I'm adding some testcases to illustrate. --TEST-- Trigger __call() in lieu of non visible methods when called via a callback. --FILE-- <?php class C { protected function prot() { } private function priv() { } public function __call($name, $args) { echo "In __call() for method $name()\n"; } } $c = new C; call_user_func(array($c, 'none')); call_user_func(array($c, 'prot')); call_user_func(array($c, 'priv')); ?> --EXPECTF-- In __call() for method none() In __call() for method prot() In __call() for method priv() --TEST-- Trigger __callStatic() in lieu of non visible methods when called directly or via a callback. --FILE-- <?php class C { protected static function prot() { } private static function priv() { } public static function __callStatic($name, $args) { echo "In __callStatic() for method $name()\n"; } } echo "Using direct method invocation:\n"; C::none(); C::prot(); C::priv(); echo "\nUsing callbacks:\n"; call_user_func(array('C', 'none')); call_user_func(array('C', 'prot')); call_user_func(array('C', 'priv')); ?> --EXPECTF-- Using direct method invocation: In __callStatic() for method none() In __callStatic() for method prot() In __callStatic() for method priv() Using callbacks: In __callStatic() for method none() In __callStatic() for method prot() In __callStatic() for method priv()

« previous php.internals (#42537) next »