现在我听说c#中的朋友功能然后我只是google了解它。我很想知道在php中也允许朋友功能。所以我的问题是什么是朋友的功能?我怎么能在PHP中使用它?这仅用于OOP吗?
答案 0 :(得分:9)
封装和抽象(数据隐藏)的概念表明非成员函数不应该能够访问对象的私有和受保护数据。该政策是,如果您不是会员,则无法进入。但可能会出现某些情况,您需要与非会员共享您的私人或受保护数据。在这里,'朋友'来救援。
友元函数是一个非成员函数,可以访问类的私有和受保护成员。
朋友功能指针:
朋友功能可能被宣布为多个班级的“朋友”。 它没有类的范围,因为它取决于函数的原始定义和声明。 它不需要一个对象(该类声明它是朋友)。它可以像普通函数一样调用。 由于它不是成员函数,因此无法直接访问类的成员,并且必须使用对象名称和成员运算符(。)以及每个成员名称。 它可以在类中的任何地方声明,而不会影响其含义。 该类的成员函数对用于调用它的对象的成员进行操作,而友元函数对作为参数传递给它的对象进行操作。Link for php
PHP实施
class MyBaseClass
{
protected static $friendClasses = array();
public function __get($name)
{
if (
// check if the caller's class is one of the friend classes
($trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)) &&
(isset($trace[1]['class']) && in_array($trace[1]['class'], static::$friendClasses))
) {
return $this->$name;
} else {
trigger_error('Member not available: ' . $name, E_USER_ERROR);
}
}
}
答案 1 :(得分:2)
朋友功能最好在许多不同的类之间共享。这些函数可以声明为一个类的成员函数或全局函数。在任何一种情况下,通过使用允许它们的类中的朋友说明符,可以将它们设置为其他类的朋友。这些函数可以使用类的所有属性,将它们命名为朋友,就像它们本身就是该类的成员一样。
友元声明本质上是成员函数的原型,但是不需要通过双冒号语法附加该类名称的实现,而是另一个类的全局函数或成员函数提供匹配。
对于PHP 5.3+实现,您将需要一个基类。应该由需要有朋友的类扩展的类。这个基类提供了友元架构,因此它只需要编码一次。
class MyBaseClass
{
protected static $friendClasses = array();
public function __get($name)
{
if (
// check if the caller's class is one of the friend classes
($trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)) &&
(isset($trace[1]['class']) && in_array($trace[1]['class'], static::$friendClasses))
) {
return $this->$name;
} else {
trigger_error('Member not available: ' . $name, E_USER_ERROR);
}
}
}
Then all you need to do do make add a friend to your class is declare it.
class Pooh extends MyBaseClass
{
protected static $friendClasses = array('Piglet', 'Tigger');
protected $feelings = 'sad';
}
class Piglet
{
public function beSensitive(MyBaseClass $Character)
{
echo 'You are so ' . $Character->feelings . '!';
}
}
现在小猪可以获得维尼的感受。
$Pooh = new Pooh();
$Piglet = new Piglet();
$Piglet->beSensitive($Pooh);
友元函数允许定义二元运算符,它组合了一对对象中的私有数据。当使用C ++的运算符重载功能时,这尤其强大。当我们查看重载时,我们将返回它。