Страница 1 из 2

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

Добавлено: 20 июн 2014, 19:04
Redee
Наверное глуповатый вопрос но все же )).

Как здесь чтобы обратиться к классу через переменную ??? >
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 ... ctions.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';
	}
}

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

Добавлено: 21 июн 2014, 09:49
Asmodey
СРОЧНО УЧИТЬ МАТЧАСТЬ!!!

FlayFast::fly();

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

Добавлено: 21 июн 2014, 20:41
Redee
Слушай если ты не понял что я хотел, не надо навязывать то что я и так давно знаю.

Добавлено: 22 июн 2014, 10:47
Asmodey
Для того, чтобы вызвать статический метод, не обязательно создавать объект.

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.
И маленький вопрос - а с какой целью класс определять строкой?
(Моё наследие с++ всегда очкует такого, я помню про мега-гибкость пыха)

Добавлено: 22 июн 2014, 21:37
Redee
Нет НЕ обязательно чтобы статика была, я просто проверял как работает.
У меня была ошибка в том что надо было указывать стат. методы в классах и интерфейсе.

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

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

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

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

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

Добавлено: 23 июн 2014, 10:37
Asmodey
Тодыть, получаем более универсальный
Plain::performFly($typeFly)
{
	$obj = new $typeFly;
	$obj->fly(); 
}
Если флай в целевом объекте статическая, то имеем вроде как лишнее создание объекта :) Видится, что не большая плата.

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

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

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

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

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

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

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

[upd=1403529672][/upd]
Интересно...
Как же реализовать.
http://www.php.net/manual/ru/function.s ... gister.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/mast ... _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]
з.ы.ы. Вот так вот отказались от многого лишнего, избыточных скриптов автозагрузки и древних решениях.

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

Добавлено: 24 июн 2014, 13:37
Asmodey
Тоже смотрел в сторону наймспейсы=пути. Можно и дописывать каталог где всё лежит class.

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

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

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

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