C# 什么是php中的friend函数?

C# 什么是php中的friend函数?,c#,php,C#,Php,现在我听说了c#中的friend函数,然后我只是通过谷歌来了解它。我想知道在php中还允许使用友元函数。所以我的问题是什么是朋友函数?如何在php中使用它?这是否仅用于OOPs?封装和抽象(数据隐藏)的概念表明,非成员函数不应能够访问对象的私有和受保护数据。政策是,如果你不是会员,你就不能进去。但在某些情况下,您可能需要与非成员共享您的私人或受保护的数据。“朋友们”来拯救我们 友元函数是可以访问类的私有和受保护成员的非成员函数 友元函数的指针: 友元函数可以声明为多个类的“友元”。 它没有类的作

现在我听说了c#中的friend函数,然后我只是通过谷歌来了解它。我想知道在php中还允许使用友元函数。所以我的问题是什么是朋友函数?如何在php中使用它?这是否仅用于OOPs?

封装和抽象(数据隐藏)的概念表明,非成员函数不应能够访问对象的私有和受保护数据。政策是,如果你不是会员,你就不能进去。但在某些情况下,您可能需要与非成员共享您的私人或受保护的数据。“朋友们”来拯救我们

友元函数是可以访问类的私有和受保护成员的非成员函数

友元函数的指针:

友元函数可以声明为多个类的“友元”。 它没有类的作用域,因为它依赖于函数的原始定义和声明。 它不需要对象(声明为友元的类的对象)。它可以像普通函数一样调用。 由于它不是成员函数,因此无法直接访问类的成员,并且必须对每个成员名称使用对象名和成员运算符(.)。 它可以在类中的任何位置声明,而不影响其含义。 类的成员函数操作用于调用它的对象的成员,而友元函数操作作为参数传递给它的对象

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

好友函数最好在多个不同的类之间共享。此类函数可以声明为一个类的成员函数,也可以声明为全局函数。在任何一种情况下,都可以通过在接纳它们的类中使用友元说明符,将它们设置为其他类的友元。这样的函数可以使用类的所有属性,这些属性将它们命名为朋友,就好像它们自己是该类的成员一样

友元声明本质上是一个成员函数的原型,但是不需要使用双冒号语法附加该类名称的实现,而是由另一个类的全局函数或成员函数提供匹配

对于这个PHP5.3+实现,您需要一个基类。需要有朋友的班级应该扩展的班级。这个基类提供了friend架构,因此它只需要编码一次

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++的操作符重载特性时,这尤其强大。当我们研究重载时,我们将回到它。

那么php和c中的friend函数有什么不同呢#