php中的朋友功能是什么?

时间:2014-02-07 06:41:50

标签: c# php

现在我听说c#中的朋友功能然后我只是google了解它。我很想知道在php中也允许朋友功能。所以我的问题是什么是朋友的功能?我怎么能在PHP中使用它?这仅用于OOP吗?

2 个答案:

答案 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);  
        }  
    }  
} 

Link reference

答案 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 ++的运算符重载功能时,这尤其强大。当我们查看重载时,我们将返回它。