php __autoload () и определение динамического / динамического класса - есть ли способ без eval? - PullRequest
0 голосов
/ 27 сентября 2010

Я прочитал этот пост после поиска похожих постов.

У меня немного другая, но связанная проблема.

Есть ли способ БЕЗ ВЕЛИЧИНЫ () (потому что это плохая идея - открывать для злоупотреблений, если кто-то позволяет пользователю указать значение, используемое в eval и т. д.), чтобы можно было определить структуру класса, например:

if(!class_exists($className) && dao::tableExists($className)) {
   class $className extends daoObject {
     public function __construct($uid) {
      parent::__construct($uid);
     }
   }
   dao::generateClass($className);
}

Причина этого в том, что когда новые базовые таблицы добавляются в каркас, они могут использоваться с универсальным объектом доступа к данным для доступа к соответствующим полям (получение / установка через __call в родительском объекте, добавление / вставка и обновление / удаление).) без написания класса для каждого из них, не требуя, чтобы кодировщик написал класс, а затем пришлось проверять его или писать собственные генераторы кода для различных типов таблиц.daoObject делает все это для меня.

Намерение состоит в том, чтобы использовать этот вид метода для определения класса, если он не существует, а затем записать определение класса в файл.

Еслиимя соответствующей таблицы не существует, оно не будет выполнено.Если класс существует (например, при следующем запуске), он не будет его определять.Если он не существует, но является именем таблицы, вы можете создать его, использовать и сохранить при первом вызове, что произойдет, когда будут вставлены новые таблицы и запущен скрипт для вставки данных.Авторы будут определять только поля таблицы и примеры данных через CSV.Этот сценарий будет генерировать классы и импортировать данные одним ударом.Я мог бы записать определение в файл, а затем включить его, что, кажется, могло бы работать, но я хочу сделать это ПОСЛЕ того, как я изменил свойства объекта, поэтому мне не нужно дважды записывать в файлы, чтобы сделать егоработа.

Это упрощенно , но возможно ли это?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2010

Нельзя использовать переменную для имени класса (если, как вы говорите, с eval()).

Так что если вам действительно нужно создавать объекты DAO во время выполнения для таблиц, для которых класс не определен, возможно, вам следует создать класс DAO для «другой таблицы» и передать имя таблицы в конструкторе.

class OtherTable extends daoObject {
  public function __construct($uid, $tableName) {
   $this->table = $tableName;
   parent::__construct($uid);
  }
}

$FootballTable = new OtherTable($uid, 'football'); 
trigger_error("You need a new table class!", E_USER_WARNING);

Если ваши журналы показывают, что у вас есть какое-либо из этих предупреждений пользователя, вы должны использовать это как напоминание, чтобы создать надлежащий класс для новых таблиц.


Ваш комментарий:

Генерация кода для нового класса во время выполнения, даже в качестве запасного условия, не является хорошей привычкой. Риск заключается в том, что какой-то ненадежный контент проскальзывает в определение вашего класса (например, пользовательский ввод, но это может быть что-то другое). Тогда у вас проблема с внедрением кода проблема безопасности.

Либо вам нужен универсальный класс DAO для любых таблиц, как я показал, либо лучшее решение - создавать новые классы DAO во время разработки во время создания новых таблиц в вашей базе данных. Почему это не ваше решение?

0 голосов
/ 27 сентября 2010

Я не думаю, что это возможно; как вы сказали, лучше всего написать класс в файл, а затем автоматически загрузить эти / эти классы.

...