【问题标题】:How do I give reference to functions from one class to another?如何将一个类的函数引用到另一个类?
【发布时间】:2011-08-31 19:13:32
【问题描述】:

以下是我的简化代码

<?php
  $database = new db();
  $file = new file();
  $input = new input();
  $output = new output();

  $data = "SELECT * FROM table;";
  $input->page($data);

  class db {
        public function queryExecute($var) {
              $var = $this->queryEncode($var);
              $var = $this->querySubmit($var);
        return $var;
        }

        public function queryEncode($var) {
              // Do somthing
        return $var;
        }

        public function querySubmit($var) {
              // Do somthing
        return $var;
        }
  }

问题是当我将它添加到代码中时:

  class input {
        public function page($data) {
              // Do something
              $pageQuery = db::queryExecute($data);
        }
  }

有了这个,我必须做两件事。首先,如果服务器设置为严格,我必须隐藏db::queryExecute($data); 代码的错误。现在解决第二个问题。如果被引用的类正在引用另一个类,但这次是在它自己的类中,我似乎无法使用这行代码(这是我发现除了使用 Abstract 之外引用其他类的唯一方法)。

为了更好的解释,过程如下:

  1. 获取$data 变量并将其发送到$input-&gt;page() 函数($input-&gt;page($data))。
  2. 引用db类,$input-&gt;page()函数通过db::queryExecute()格式(db::queryExecute($data))将信息发送到$database-&gt;queryExecute()函数。
  3. 但是因为我们使用::,当$database-&gt;queryExecute()引用$database-&gt;queryEncode()$database-&gt;querySubmit()使用$this-&gt;操作符($this-&gt;queryEncode()$this-&gt;querySubmit()),$this-&gt;当前属于@987654340不是$database-&gt;

那么解决方案是什么...以不同的方式引用另一个类(而不是::)?定义类时使用$_GLOBAL 变量?使用 $this-&gt; 以外的东西?将所有类配置为使用ABSTRACT/EXTENDS(或INTERFACE)?

输出的以下错误指的是$var = $this-&gt;queryEncode($var);

Fatal error: Call to undefined method input::querySubmit() in C:\[...]\global.php on line 12

【问题讨论】:

  • 发布您收到的错误。

标签: php class reference external


【解决方案1】:

不要对非静态函数进行静态调用。将$db instance 传递给页面,或提供对数据库的全局访问(通过全局注册表、单例或其他方法)。但最好将依赖项(数据库实例)传递给方法。

<?php
  $database = new db();
  $file = new file();
  $input = new input($database);
  $output = new output();

  $data = "SELECT * FROM table;";
  $input->page($data);

  class db {
        public function queryExecute($var) {
              $var = $this->queryEncode($var);
              $var = $this->querySubmit($var);
        return $var;
        }

        public function queryEncode($var) {
              // Do somthing
        return $var;
        }

        public function querySubmit($var) {
              // Do somthing
        return $var;
        }
  }

  class input {
    protected $_database;
    public function __construct($database) {
        $this->_database = $database;
    }
    public function page($data) {
          // Do something
          $pageQuery = $this->_database->queryExecute($data);
    }
  }

【讨论】:

  • 你能否给我一个简短的例子和/或通过将依赖项传递给方法来更好地解释你的意思,如果这不是要求太多吗?
  • $input->page($data, $database); // 你也可以在页面的构造函数中传递数据库。
  • 我已经尝试过了,但无济于事。我将上面给出的代码中的第 3-5 行复制到 db 类的开头,例如 private $file = new file(); 但随后它给了我这个错误:Parse error: syntax error, unexpected T_NEW in C:\[...]\global.php on line 11
  • 您不能在成员声明中实例化对象。您必须为此使用类构造函数。添加了一个示例。
  • 啊,这可能会解决它!我认为您不必使用 __construct() 类来初始设置变量(或本例中的类)。
【解决方案2】:

您只能在类的静态、常量或重写的属性或方法上使用双冒号运算符。请参阅documentation。请改用-&gt;

【讨论】:

  • 这是我的初衷,但我无法让 -&gt; 工作,因为该变量对班级不可见。
猜你喜欢
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
相关资源
最近更新 更多