【问题标题】:Accessing Private Function From Outside Class从类外部访问私有函数
【发布时间】:2011-12-29 08:05:41
【问题描述】:

我正在学习 OO 的东西,遇到了这个:

class n{

    private function f($v){
        return $v*7;
    }

    function c(){
       return $this->f(5);
    }
}

$o = new n;
echo $o->c(); //returns 35

如果我仍然可以从课堂外访问它,这难道不符合声明函数private 的目的吗?这不应该被完全阻止吗?我错过了什么吗?请帮忙清理。谢谢

【问题讨论】:

  • 你可以从公共方法调用私有方法。否则你怎么能调用私有方法? :D

标签: php oop private


【解决方案1】:

声明 private 只是将它们从公共界面中隐藏起来。您完全有权在您的代码中执行类似 sn-p 的操作;即根据“隐藏的”私有内部方法实现公共接口。

如果您正在编写一个库,您可能会保留明确定义的公共接口,并尽量减少版本之间的更改(这样用户就不必维护他们的代码)。但是您可以随意修改内部内容,而无需向用户支付任何费用。

【讨论】:

    【解决方案2】:

    您错过了要点,您不要从外部调用private 方法。您从外部调用 public 方法(缺少可见性修饰符 = public),然后从该类内部调用private 方法。

    【讨论】:

      【解决方案3】:

      你甚至不能从你的代码调用你的函数,你调用

      $this->f(5);
      

      通过调用

      c()
      

      至少在您发布的代码中,您无法使用不同的参数调用 f()。

      但不,从公共方法调用私有方法不是代码味道

      我的意思是,如果不是从公共方法中调用它们,您还希望从哪里调用它们?

      【讨论】:

        【解决方案4】:

        private 方法意味着它执行与外部世界(类外部)无关的内部工作。

        【讨论】:

          【解决方案5】:

          公共函数旨在对该类的实例执行操作。说,Save()

          Save() 的内部工作对调用者来说并不有趣;他只是想保存它,并不关心这是怎么发生的。

          就风格而言,您可能希望也可能不希望在该方法中实际执行保存。它可能取决于设计选择或对象的属性。见:

          class FooObject
          {
          
              private $_source;
          
              public function Save()
              {
          
                  if ($this->_source == "textfile")
                  {
                      $this->saveToTextfile();
                  }
                  elseif ($this->_source == "database")
                  {
                      $this->saveToDatabase();
                  }
              }
          
              private function saveToTextfile()
              {
                  // Magic
              }
          
              private function saveToDatabase()
              {
                  // Magic
              }
          }
          

          您不希望任何人直接调用私有方法,因为它们仅供内部使用。但是,公共方法可能会间接调用私有方法。

          【讨论】:

            【解决方案6】:

            您不能直接从外部调用$o->f(),这是private 应该保护的全部。如果你不能调用private 方法,如果any public 方法涉及调用堆栈中的任何位置,那么你根本无法调用它。 一些类的方法需要从外部调用;然后可以在内部拨打电话。

            【讨论】:

              【解决方案7】:

              您的代码是正确的,但是如果您没有指定方法权限(即:public、private 或 protected),则将默认行为分配给它。因此,此时您的函数 c() 实际上是公开的,这就是您可以从类外部调用它的原因。

              如果您将其切换为私有或受保护,您将收到预期的错误。

              【讨论】:

                【解决方案8】:

                如果您的类不是唯一的类(其中包含由启动机制调用的 main() 方法),那么在调用“链”的某处必须有一个类外调用者,否则它的方法应该是从来没有打电话。

                【讨论】:

                • (对于downwoters:我知道,这不是解决方案。我只是想指出,问题中描述的概念有什么错误。)
                【解决方案9】:
                    <?php
                //Accessing private method in php with parameter
                    class Foo {
                        private function validateCardNumber($number)
                        {   
                            echo $number;
                        }
                    }
                    $method = new ReflectionMethod('Foo', 'validateCardNumber');
                    $method->setAccessible(true);
                
                    echo $method->invoke(new Foo(), '1234-1234-1234');
                    ?>
                

                【讨论】:

                  猜你喜欢
                  • 2014-12-29
                  • 2016-08-04
                  • 1970-01-01
                  • 2011-05-08
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-03-05
                  • 2013-02-23
                  相关资源
                  最近更新 更多