在类的方法函数中传递父类静态变量

时间:2018-01-27 23:39:49

标签: php oop

我需要在子类的方法中调用函数中传递父类变量。

请看代码!

class CsBuilder {

     protected static $mysqli = 0;

     private function connect() {
          // make connection
          $mysqli = new mysqli(data);
          self::$mysqli = $mysqli;
     }

     public function initialise() {
          $this->connect();
          // other stuff
     }
}

class App extends CsBuilder {

     public function test() {

          // parent::$mysqli is accessable here!

          function innerFuntion() {
               $query = 'some query';
               // parent::$mysqli->query($query);
               // how to access parent::$mysqli here?
          }

          innerFuntion(); 
     }
}

$builder = new CsBuilder();
$builder->initialise();

$app = new App();
$app->test();

我遇到了错误:

PHP Fatal error:  Class 'parent' not found...

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:2)

您正在尝试使用其范围之外的变量。查看PHP手册中的第二个示例:http://php.net/manual/en/language.variables.scope.php

以下是固定代码,请在线试用:http://sandbox.onlinephpfunctions.com/code/80ce967c0b499ce026fbc5d92209c9b8c8cd6323

这是一个改变:

public function test() {

  // parent::$mysqli is accessable here!

  function innerFuntion($db) {
    var_dump($db);
  };

  innerFuntion(parent::$mysqli); // pass it to the function
}

警告:像你一样使用类方法中的函数是代码味道。考虑其他方法:

anonymous functions

的轻型重构器

通过这种方式,您将确保您的函数类似宏,将用于循环

public function test() {

  // parent::$mysqli is accessable here!
  $db = parent::$mysqli

  $innerFuntion = function () use ($db) {
    var_dump($db);
  };

  $innerFuntion();
}

正确的方法:提取方法

innerFuntion提取到私有方法中,这样就不会弄乱对象的公共API,但会共享对象的封装状态,并且可以直接在test方法中使用。

class App extends CsBuilder {

  public function test() {
    $this->innerFuntion('a', 'b');
  }

  private function innerFuntion(arg1, arg2) {
    $query = 'some query';
    parent::$mysqli->query($query);
  }
}