我正在阅读一些 PHP 代码,我注意到一个类在其兄弟(从一个共同的父级继承)上调用了一个受保护的方法。这让我觉得违反直觉。
in the same inheritance tree
在 PHP 中是否意味着类似于 Java 的part of the same package
东西?
因为我更习惯 C# 中受保护的含义,所以我没想到能够在同级类上调用受保护的方法。在 Java 中,从包中可以清楚地看出区别。除了继承之外,还有什么东西可以在 PHP 的这个实例中定义可访问性吗?
<?
class C1
{
protected function f()
{
echo "c1\n";
}
}
class C2 extends C1
{
protected function f()
{
echo "c2\n";
}
}
class C3 extends C1
{
public function f()
{
// Calling protected method on parent.
$c1 = new C1();
$c1 -> f();
// Calling protected method on sibling??!?
$c2 = new C2();
$c2 -> f();
echo "c3\n";
}
}
$c3 = new C3();
$c3 -> f();
// OUTPUT:
// c1
// c2
// c3
这是我在 C# 中尝试做同样的事情(但失败了)。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
class c1
{
protected void f()
{
Console.WriteLine("c1");
}
}
class c2: c1
{
protected void f()
{
Console.WriteLine("c2");
}
public void g()
{
Console.WriteLine("g!");
}
}
class c3 : c1
{
protected void f()
{
// Error 1 Cannot access protected member 'ConsoleApplication2.c1.f()'
// via a qualifier of type 'ConsoleApplication2.c1'; the qualifier must be
// of type 'ConsoleApplication2.c3' (or derived from it)
//c1 cone = new c1();
//cone.f();
base.f();
c2 ctwo = new c2();
//Error 1 'ConsoleApplication2.c2.f()' is inaccessible due to its protection level
ctwo.f();
ctwo.g();
Console.WriteLine("c3");
}
}
class Program
{
static void Main(string[] args)
{
c3 cthree = new c3();
// Error 2 'ConsoleApplication2.c3.f()' is inaccessible due to its protection level
cthree.f();
}
}
}
看起来预期的行为是 PHP 5.2 之前的情况。 这个 RFC 对这个问题进行了更多解释,并指出了为什么这个 bug 发生了变化。
我不确定它是否完全回答了我的问题,但我想我会更新这个问题,以防它帮助任何人。
感谢 Robin F. 为我提供了有关 RFC 的讨论的一些背景信息。