Как мне дать ссылку на функции из одного класса в другой? - PullRequest
0 голосов
/ 31 августа 2011

Вот мой упрощенный код

<?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->page() ($input->page($data)).
  2. Ссылаясь на класс db, функция $input->page() отправляет информацию в функцию $database->queryExecute() с помощью формата db::queryExecute() (db::queryExecute($data)).
  3. Но поскольку мы используем ::, когда $database->queryExecute() ссылается $database->queryEncode() и $database->querySubmit() с использованием оператора $this-> ($this->queryEncode() и $this->querySubmit()), $this-> в настоящее время принадлежит $input-> и не $database->.

Так в чем же решение ... По-другому ссылаться на другой класс (вместо ::)? Использовать переменную $_GLOBAL при определении моих классов? Использовать что-то кроме $this->? Настройте все классы для использования ABSTRACT / EXTENDS (или INTERFACE)?

Следующая выведенная ошибка относится к $var = $this->queryEncode($var);:

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

Ответы [ 2 ]

0 голосов
/ 31 августа 2011

Не делать статический вызов не статической функции. Передайте $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);
    }
  }
0 голосов
/ 31 августа 2011

Вы можете использовать оператор с двоеточием только для статических, константных или переопределенных свойств или методов класса.См. документацию по этому вопросу.Вместо этого используйте ->.

...