Логотип   Простое и понятное управление
  Уникальные возможности по настройке
  Open Server скачали уже 1 021 172 раза!

Форум

Добро пожаловать, Гость!

Обращение к классу через переменную в php ?

Обсуждение вопросов на другие темы связанные с веб-разработкой
Аватара пользователя
Redee
Сообщения: 218
C нами: 3 года 5 мес

Непрочитанное сообщение Redee » 20 июн 2014, 19:04

Наверное глуповатый вопрос но все же )).

Как здесь чтобы обратиться к классу через переменную ??? >
class Plain
{
   function performFly($typeFly)
   {
      
   }
}


Для этого >
spl_autoload_register(
   function($class){
      include "/class/$class.php";
   }
);
$ob = new Plain;
$ob->performFly('flyFast');
$ob->performFly('flySlow);


Имеем 2 файла + 2 класса и статические методы в них на отображение текста >
class FlyFast
{
   public static function fly()
   {
      echo 'flying fast';
   }
}

class FlySlow
{
   public static function fly()
   {
      echo 'flying slow';
   }
}


[upd=1403281170][/upd]
Наверное такого не существует в природе )).
Нашел только как к методам через переменные, но это не решает нужную задачу.
http://www.php.net//manual/ru/functions.variable-functions.php

[upd=1403281332][/upd]
Тогда выходит что 1 файл 1 класс с множеством методов, который разрастается до невероятных размеров.

[upd=1403283672][/upd]
Решение обычными объектами >

Index.php >
<?
spl_autoload_register(
   function($class){
      include "/$class.php";
   }
);
$ob = new Plain;
$ob->displayFly('flyfast');


Plain.php >
<?
class Plain
{
   public function displayFly($typeFly)
   {
      $ob = new $typeFly;
      $ob->fly();
   }
}


Fly.php >
<?
interface Fly
{
   function fly();
}


FlyFast.php >
<?
class FlyFast implements Fly
{
   public function fly()
   {
      echo'fly fast';
   }
}

Аватара пользователя
nick
Сообщения: 115
C нами: 5 лет 2 мес
Откуда: Россия
Контакты:

Непрочитанное сообщение nick » 20 июн 2014, 20:45

Вы, кажется, форумом ошиблись, уважаемый. Вам сюда :D

Аватара пользователя
Asmodey
Сообщения: 299
C нами: 4 года 7 мес

Непрочитанное сообщение Asmodey » 21 июн 2014, 09:49

СРОЧНО УЧИТЬ МАТЧАСТЬ!!!

FlayFast::fly();

На сайте пыха приличный ман. И он обычно умеет говорить по-русски.

Аватара пользователя
Redee
Сообщения: 218
C нами: 3 года 5 мес

Непрочитанное сообщение Redee » 21 июн 2014, 20:41

Слушай если ты не понял что я хотел, не надо навязывать то что я и так давно знаю.

Аватара пользователя
Asmodey
Сообщения: 299
C нами: 4 года 7 мес

Непрочитанное сообщение Asmodey » 22 июн 2014, 10:47

Для того, чтобы вызвать статический метод, не обязательно создавать объект.

FlayFast.php
<?php
class FlyFast
{
   public static function fly()
   {
      echo 'flying fast';
   }
}


FlaySlow.php
<?php
class FlySlow
{
   public static function fly()
   {
      echo 'flying slow';
   }
}


Plain.php
<?php
class Plain
{
   function performFly($typeFly)
   {
   //$obj = ($typeFly);
        //Тут проверять, что за зверь $obj
   //$obj::fly();     
       $typeFly::fly();
   }
}


runner.php
<?php

spl_autoload_register(
   function($class){
      include "/$class.php";
   }
);
$ob = new Plain;
$ob->performFly('FlyFast');
$ob->performFly('FlySlow');


ИМХО. Кошерней - завести базовый класс обязующий иметь fly(). Кста, а она обязательна статическая по какой-то причине?
Наследовать и проверять в Plain.
И маленький вопрос - а с какой целью класс определять строкой?
(Моё наследие с++ всегда очкует такого, я помню про мега-гибкость пыха)

Аватара пользователя
Redee
Сообщения: 218
C нами: 3 года 5 мес

Непрочитанное сообщение Redee » 22 июн 2014, 21:37

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

В этом конкретном случае для гибкости передаю строкой.
Автоподгрузка работает, все работает, открывает нужный файл с нужным классом.

Здесь НЕ нужно определять в базовом классе Plain метод fly().
В базовом только то что НЕ будет меняться.
То что меняется мы возлагаем на плечи файлам с классами.

Представь ситуацию что 50 разрабов пишут свой тип "флая)))".
Со своей стороны основняк написал и забыл, меняется только переменная для отображения "флая".
Те же разрабы напишут свои "флаи" в своих отдельных файлах.

Мне остается только положить файлы с "флаями" в папку автоподгрузки классов.

Видимо тебя смутило что я предпочитаю компоновку нежели наследование, но наследование имеет кучу проблем если часть кода может быть изменяема.

Аватара пользователя
Asmodey
Сообщения: 299
C нами: 4 года 7 мес

Непрочитанное сообщение Asmodey » 23 июн 2014, 10:37

Тодыть, получаем более универсальный

Plain::performFly($typeFly)
{
   $obj = new $typeFly;
   $obj->fly();
}


Если флай в целевом объекте статическая, то имеем вроде как лишнее создание объекта :) Видится, что не большая плата.

Вот перечитал, и вышел совсем уж надуманный пример :)))
Передаётся название класса. Создаётся новый объект и для него вызывается не статический метод.

ИТОГО. Если функция статическая, вызываем без создания объекта: $name::func(). Иначе - создаём экземпляр и вызываем метод. А вот ежели извернуться, и в месте вызова городить обёртку и передавать лямбду. Тогда будет вызов какого-то флая: либо статический метод, либо обёртка из вызова метода конкретного экземпляра. (Совсем что-то я фантазии ударился).

ЗЫ. В базовом классе не неизменяемая часть, а поведение по-умолчанию. Которое вполне можно заменить.
Последний раз редактировалось DelphinPRO 24 июн 2014, 11:52, всего редактировалось 1 раз.
Причина: оформляйте код соответствующим bb-тегом

Аватара пользователя
Redee
Сообщения: 218
C нами: 3 года 5 мес

Непрочитанное сообщение Redee » 23 июн 2014, 16:00

Сделал несколько по другому, записывая текущий тип полета в изменяемое свойство объекта.
Меняется методом "сеттером" который спрашивает данные через статику с отдельного файла/класса/стат.метода.

https://github.com/Redee/test/tree/master/Plain

з.ы. На перспективе если проект разрастается (разрабы написали более 3000 файлов с "флаями") то нельзя хранить все в одной папке автоподгрузки, щас поищу как динамически изменять папки для каждого програмера, если это возможно в рамках входящего скрипта index.php

з.ы. То есть допустим все пляшет от модели самолета.
Иерархия автоподгрузки при этом принимает такой вид:
/class/[модель_самолета]/$class.php

[upd=1403529672][/upd]
Интересно...
Как же реализовать.
http://www.php.net/manual/ru/function.spl-autoload-register.php
spl_autoload_register() позволяет задать несколько реализаций метода автозагрузки описаний классов и интерфейсов. Она создает очередь из функций автозагрузки в порядке их определения в скрипте, тогда как встроенная функция __autoload() может иметь только одну реализацию.


[upd=1403529906][/upd]
Еще такая цель, чтобы не бежало по всему стеку ф-ий автозагрузки, а точно брала необходимую автозагрузку.

[upd=1403531102][/upd]
Во начало вырисовываться имея такой тестируемый код, мы с указанием 2ух параметров, добиваемся того чтобы последняя указанная автозагрузка была ПЕРВОЙ СПРАШИВАЕМОЙ.
Без параметров мы уходим в ошибки так как спрашивается физически определенная первее автозагрузка.
Там следует наверное еще после отработки последней автозагрузки, обратно возвращать автозагрузку по умолчанию, чтобы не нарушать изначальную точку подхватывания файлов с классами.

Это пока что в стадии тестирования черновой вариант, надо сделать отдельный универсальный файл/класс/метод для выполнения данных целей. :)

function my_auto1($class)
{
   include "/$class.php";
}

function my_auto2($class)
{
   include "/su35/$class.php";
}

spl_autoload_register('my_auto2');
spl_autoload_register('my_auto1',true,true);
$ob = new Plain('flyslow');


[upd=1403546076][/upd]
И тут опять началась эпопея с пространствами имен..........

[upd=1403553633][/upd]
На деле оказалось все довольно функционально.
Окончательный вариант довольно гибкой автозагрузки с пространством здесь >
https://github.com/Redee/test/tree/master/plain_aload_nsp

Подсмотрел решение через пустой вызов вначале скрипта
spl_autoload_register();
здесь >
http://habrahabr.ru/post/136761/
Там принципиально чтобы 1 к 1 были неймспейсы и пути каталогов.

Через обратный слэш вначале имени в местах указания наследования добился вынесения интерфейса в обший каталог (здесь просто вспомнил по аналогии подтягивания файлов относительно корн. каталога, в данном случае каталога с index.php).

Оказалось все прокатило, все круто и лучше некуда :D :D :D

з.ы. Если все в 1ой корневой папке просто вначале index.php прописываем spl_autoload_register(); и ВСЕ.
Файлы с классами подтягиваются через глобальный общий неймспейс, соответственно указывать простр.имен им НЕ надо.

[upd=1403553980][/upd]
з.ы.ы. Вот так вот отказались от многого лишнего, избыточных скриптов автозагрузки и древних решениях.

з.ы.ы.ы. Чето не смог увидеть кнопку - отредактировать сообщение или это я так на сайт влияю ))), или таймер выставили )).

Аватара пользователя
Asmodey
Сообщения: 299
C нами: 4 года 7 мес

Непрочитанное сообщение Asmodey » 24 июн 2014, 13:37

Тоже смотрел в сторону наймспейсы=пути. Можно и дописывать каталог где всё лежит class.

ЗЫ. fly() вычисляется в конструкторе и хранится токма результат.
$ob = new Plain('flyslow');//<-фактически вычисляется здесь.
$ob->displayFly();


ЗЫЗЫ. Зенд отпиливает префикс(ы) через _. ИМХО - нэймспейсы краше.

Аватара пользователя
Redee
Сообщения: 218
C нами: 3 года 5 мес

Непрочитанное сообщение Redee » 24 июн 2014, 14:02

Когда искал вчера тоже наткнулся на решение через "нижние черточки" - сразу скажу отнего воняло "душком" за версту))). Но видимо это имело место быть до 2009 года, пока не вышел php5.3 с неймспейсами и их поддержкой в spl. Собственно эту заметку о модернизации и пишут в мануале на пхп.нет про ф-ию spl_autoload_register().

В этом примере НЕ разжевывается, но ключ для разрабов там оставили (1ый абзац) >
http://www.php.net/manual/ru/function.spl-autoload-register.php#92514

Тут говорится про подводный камень для OS X (может есть решение универсальное, но я не искал... )))) >
http://www.php.net/manual/ru/function.spl-autoload-register.php#96804
Но что ему мешало писать названия файлов 1 к 1 так как он вызывает со скрипта.
Это мы можем заметить в Yii где классы и файлы имеют одинаковый регистр букв, с больш. и малыми 1 к 1.


Вернуться в «Оффтоп и другие темы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей