Edit report at https://bugs.php.net/bug.php?id=62045&edit=1

 ID:                 62045
 User updated by:    gonzalo123 at gmail dot com
 Reported by:        gonzalo123 at gmail dot com
 Summary:            public access to a protected method
 Status:             Not a bug
 Type:               Bug
 Package:            Class/Object related
 Operating System:   Linux
 PHP Version:        5.3.13
 Block user comment: N
 Private report:     N

 New Comment:

OK. We must take into account the difference between "class" and "instance of a 
class". IMHO the script should throw a error, but I understand the reasons.

So: Not a bug


Previous Comments:
------------------------------------------------------------------------
[2012-05-16 18:20:36] cataphr...@php.net

Actually in Java protected is on an instance basis (unlike private), but it 
also includes package access.

------------------------------------------------------------------------
[2012-05-16 15:10:19] anon at anon dot anon

Here is another case which shows access granted based on class and not instance:

$a = new A();
$a->other = new A();
$a->foo();

class A {
        var $other;
        
        private function bar() {}
        
        public function foo() {
                $this->other->bar(); // okay to access private member of other 
instance of the same class
        }
}

It's definitely a desirable feature in this case, because it allows public 
static factory methods with private constructors. I can't think of a simple use 
for the subclass protected access though.

The PHP manual states "Members declared protected can be accessed only within 
the class itself and by inherited and parent classes. Members declared as 
private may only be accessed by the class that defines the member." 
(http://php.net/manual/en/language.oop5.visibility.php), so this is at least 
working as documented. Note the terminology: "class", not "instance of class". 
Even if a rule change was desirable it couldn't be done without breaking 
backward compatibility.

I translated both code samples here to Java and C++ to get a second opinion, as 
it were. In Java, both are allowed (see here for the rule on protected access: 
http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.2.1). In 
C++, the second example with private access from the same class is allowed; 
however the protected example given in the original report is not ("error: 
'const char* AnotherClass::foo()' is protected").

------------------------------------------------------------------------
[2012-05-16 14:21:36] cataphr...@php.net

read: "is the same in"

------------------------------------------------------------------------
[2012-05-16 14:14:39] cataphr...@php.net

Right. But it doesn't change anything. The type is only important to decide 
what the foo() method is, and foo() is AnotherClass and OneClass.

------------------------------------------------------------------------
[2012-05-16 13:15:57] gonzalo123 at gmail dot com

$this->object is not an instance of OneClass. 
$this->object is an instance of AnotherClass (look at the constructor).

------------------------------------------------------------------------


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    https://bugs.php.net/bug.php?id=62045


-- 
Edit this bug report at https://bugs.php.net/bug.php?id=62045&edit=1

Reply via email to