Php распространяется из разных классов времени выполнения (распространяется как переменная?) - PullRequest
4 голосов
/ 13 августа 2011

Это будет странно. У меня есть класс базы данных для MySQL и независимые классы. Например:

class users extends MySQL

этот класс является общим классом для пользователей, поэтому его можно использовать несколько раз. Но иногда присутствует класс «MySQL_DEBUGGED», и если да, я хочу расширить его:

class users extends MySQL_DEBUGGED

Я хочу наследовать MySQL_DEBUGGED, если есть, в противном случае класс MySQL. Если я помещу это в переменную, это сбрасывает ошибку. Как это сделать?

Ответы [ 3 ]

4 голосов
/ 13 августа 2011

Я не думаю, что вы можете наследовать от класса, имя которого не написано в сценарии PHP.


Возможное решение будет:

  • для определения двух классов, каждый из которых называется MySQL, в двух отдельных файлах
  • заставьте ваш users класс всегда расширять MySQL класс (что означает один из этих двух)
  • В зависимости от ситуации включают:
    • файл, содержащий класс «production» MySQL,
    • или файл, содержащий «развитие» MySQL класс

Таким образом, ваш класс всегда расширяет класс MySQL - но вы включите правильный .


В основном, в вашем основном файле вы должны иметь:

if (DEBUG) {
    require __DIR__ . '/MySQL-debug.php';
}
else {
    require __DIR__ . '/MySQL-production.php';
}

class users extends MySQL {
    // ...
}

И оба MySQL-debug.php и MySQL-production.php будут содержать класс с именем MySQL - который, конечно, не будет содержать одинаковые вещи в обоих файлах.

1 голос
/ 13 августа 2011

Самым простым решением было бы иметь пустой класс "bridge" и всегда наследовать от него.

Тогда единственный класс, который вам нужно было бы объявить дважды, был бы пустым.

if (class_exists('MySQL_DEBUGGED')) {
  class MySQLBridge extends MySQL { }
} else {
  class MySQLBridge extends MySQL_DEBUGGED { }
}

class User extends MySQLBridge {
  // ... your code ...
}

И, наконец, на ваших страницах:

require_once('User.php');
$user = new User();

Другие предлагаемые решения требуют наличия двух копий вашего унаследованного класса, который я не рекомендую.

1 голос
/ 13 августа 2011

Все, что вам нужно сделать, это использовать функцию class_exists().

if (class_exists('MySQL_DEBUGGED')) {
    class users extends MySQL_DEBUGGED {
        ....
    }
} else {
    class users extends MySQL {
        ....
    }
}

Я бы не рекомендовал ее.Условно объявленные занятия кажутся кошмаром.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...