Kwert-soft.ru

IT Софт для ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Обращение к переменной класса php

Обращение к переменной класса php

Здесь могла бы быть ваша реклама

Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006
Откуда: Israel

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

Само собой я знаю что ответят мне тут же, и если я посмотрю
на сообщения на форуме, то пойму что в общем то я и не ошибаюсь.
Но еще я точно замечу, что очень мало тем, в которых всего два ответа :
вопрос автора и еще два сообщение вида Ответ + Спасибо

После этого приходится начинать уточнять этим неграмотным что мне надо.
Они что, сами читать не умеют? А уточнять приходится.
И иногда пока они переварят то что я им скажу проходит и не одна ночь..

Уверен что если бы я им сказал что у меня есть
фиолетовый квадрат, и нужно превратить его в синий треугольник
и я пытался взять кисточку, макнуть в банку и поводить ей по квадрату
но почему то кисточка не принимала цвет краски в банке,
то на мой вопрос — где взять правильные банки мне бы ответили гораздо быстрее
предложив её открыть, а не тратить еще стольник на жестянку.

Поэтому с тех пор я строю свои вопросы по проверенной давным давно схеме:
Что есть
Что нужно получить
Как я пытался
Почему или что у меня не получилось.

На последок как оно происходит на форумах

Новичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался!
Старожил: Объясни, зачем тебе понадобилось дерево? Сейчас оно в строительстве практически не используется.
Новичок: Я небоскрёб собираюсь строить. Хочу узнать, из какого дерева делать перекрытия между этажами!
Старожил: Какое дерево? Ты вообще соображаешь, что говоришь?
Новичок: Чем мне нравиться этот форум — из двух ответов ниодного конкретного. Одни вопросы неподелу!
Старожил: Не нравится — тебя здесь никто не держит. Но если ты не соображаешь, что из дерева небоскрёбы не строят, то лучше бы тебе сначала школу закончить.
Новичок: Не знаите — лучше молчите! У меня дедушка в деревянном доме живёт! У НЕГО НИЧЕГО НЕ ЛОМАЕТСЯ.
Но у него дом из сосны, а я понимаю, что для небоскрёба нужно дерево прочнее! Поэтому и спрашиваю. А от вас нормального ответа недождёшся.
Прохожий: Самое крепкое дерево — дуб. Вот тебе технология вымачивания дуба в солёной воде, она придаёт дубу особую прочность:
Новичок: Спасибо, братан! То что нужно.

Отредактировано модератором: Uchkuma, 26 Апреля, 2011 — 10:21:12

Обращение к переменной класса php

For the ‘late static binding’ topic I published a code below, that demonstrates a trick for how to setting variable value in the late class, and print that in the parent (or the parent’s parent, etc.) class.

class cA
<
/**
* Test property for using direct default value
*/
protected static $item = ‘Foo’ ;

/**
* Test property for using indirect default value
*/
protected static $other = ‘cA’ ;

public static function method ()
<
print self :: $item . «rn» ; // It prints ‘Foo’ on everyway. 🙁
print self :: $other . «rn» ; // We just think that, this one prints ‘cA’ only, but. 🙂
>

public static function setOther ( $val )
<
self :: $other = $val ; // Set a value in this scope.
>
>

class cB extends cA
<
/**
* Test property with redefined default value
*/
protected static $item = ‘Bar’ ;

public static function setOther ( $val )
<
self :: $other = $val ;
>
>

class cC extends cA
<
/**
* Test property with redefined default value
*/
protected static $item = ‘Tango’ ;

public static function method ()
<
print self :: $item . «rn» ; // It prints ‘Foo’ on everyway. 🙁
print self :: $other . «rn» ; // We just think that, this one prints ‘cA’ only, but. 🙂
>

/**
* Now we drop redeclaring the setOther() method, use cA with ‘self::’ just for fun.
*/
>

class cD extends cA
<
/**
* Test property with redefined default value
*/
protected static $item = ‘Foxtrot’ ;

/**
* Now we drop redeclaring all methods to complete this issue.
*/
>

cB :: setOther ( ‘cB’ ); // It’s cB::method()!
cB :: method (); // It’s cA::method()!
cC :: setOther ( ‘cC’ ); // It’s cA::method()!
cC :: method (); // It’s cC::method()!
cD :: setOther ( ‘cD’ ); // It’s cA::method()!
cD :: method (); // It’s cA::method()!

Читать еще:  Защита от нежелательных звонков

Little static trick to go around php strict standards .
Function caller founds an object from which it was called, so that static method can alter it, replacement for $this in static function but without strict warnings 🙂

function caller () <
$backtrace = debug_backtrace ();
$object = isset( $backtrace [ 0 ][ ‘object’ ]) ? $backtrace [ 0 ][ ‘object’ ] : null ;
$k = 1 ;

return isset( $backtrace [ $k ][ ‘object’ ]) ? $backtrace [ $k ][ ‘object’ ] : null ;
>

public $data = ‘Empty’ ;

function set_data () <
b :: set ();
>

static function set () <
// $this->data = ‘Data from B !’;
// using this in static function throws a warning .
caller ()-> data = ‘Data from B !’ ;
>

$a = new a ();
$a -> set_data ();
echo $a -> data ;

?>

Outputs: Data from B !

No warnings or errors !

You use ‘self’ to access this class, ‘parent’ — to access parent class, and what will you do to access a parent of the parent? Or to access the very root class of deep class hierarchy? The answer is to use classnames. That’ll work just like ‘parent’. Here’s an example to explain what I mean. Following code

class A
<
protected $x = ‘A’ ;
public function f ()
<
return ‘[‘ . $this -> x . ‘]’ ;
>
>

class B extends A
<
protected $x = ‘B’ ;
public function f ()
<
return ‘ <' . $this ->x . ‘>’ ;
>
>

class C extends B
<
protected $x = ‘C’ ;
public function f ()
<
return ‘(‘ . $this -> x . ‘)’ . parent :: f (). B :: f (). A :: f ();
>
>

$a = new A ();
$b = new B ();
$c = new C ();

This is a solution for those that still need to write code compatible with php 4 but would like to use the flexibility of static variables. PHP 4 does not support static variables within the class scope but it does support them within the scope of class methods. The following is a bit of a workaround to store data in static mode in php 4.

Note: This code also works in PHP 5.

(Tested on version 4.3.1+)

The tricky part is when using when arrays you have to do a bit of fancy coding to get or set individual elements in the array. The example code below should show you the basics of it though.

class StaticSample
<
//Copyright Michael White (www.crestidg.com) 2007
//You may use and modify this code but please keep this short copyright notice in tact.
//If you modify the code you may comment the changes you make and append your own copyright
//notice to mine. This code is not to be redistributed individually for sale but please use it as part
//of your projects and applications — free or non-free.

//Static workaround for php4 — even works with arrays — the trick is accessing the arrays.
//I used the format s_varname for my methods that employ this workaround. That keeps it
//similar to working with actual variables as much as possible.
//The s_ prefix immediately identifies it as a static variable workaround method while
//I’m looking thorugh my code.
function & s_foo ( $value = null , $remove = null )
<
static $s_var ; //Declare the static variable. The name here doesn’t matter — only the name of the method matters.

if( $remove )
<
if( is_array ( $value ))
<
if( is_array ( $s_var ))
<
foreach( $value as $key => $data )
<
unset( $s_var [ $key ]);
>
>
>
else
<
//You can’t just use unset() here because the static state of the variable will bring back the value next time you call the method.
$s_var = null ;
unset( $s_var );
>
//Make sure that you don’t set the value over again.
$value = null ;
>
if( $value )
<
if( is_array ( $value ))
<
if( is_array ( $s_var ))
<
//$s_var = array_merge($s_var, $value); //Doesn’t overwrite values. This adds them — a property of the array_merge() function.
foreach( $value as $key => $data )
<
$s_var [ $key ] = $data ; //Overwrites values.
>
>
else
<
$s_var = $value ;
>
>
else
<
$s_var = $value ;
>
>

echo «Working with non-array values.
» ;
echo «Before Setting: » . StaticSample :: s_foo ();
echo «
» ;
echo «While Setting: » . StaticSample :: s_foo ( «VALUE HERE» );
echo «
» ;
echo «After Setting: » . StaticSample :: s_foo ();
echo «
» ;
echo «While Removing: » . StaticSample :: s_foo ( null , 1 );
echo «
» ;
echo «After Removing: » . StaticSample :: s_foo ();
echo » » ;
echo «Working with array values
» ;
$array = array( 0 => «cat» , 1 => «dog» , 2 => «monkey» );
echo «Set an array value: » ;
print_r ( StaticSample :: s_foo ( $array ));
echo «
» ;

Читать еще:  Php достоинства и недостатки

//Here you need to get all the values in the array then sort through or choose the one(s) you want.
$all_elements = StaticSample :: s_foo ();
$middle_element = $all_elements [ 1 ];
echo «The middle element: » . $middle_element ;
echo «
» ;

$changed_array = array( 1 => «big dog» , 3 => «bat» , «bird» => «flamingo» );
echo «Changing the value: » ;
print_r ( StaticSample :: s_foo ( $changed_array ));
echo «
» ;

//All you have to do here is create an array with the keys you want to erase in it.
//If you want to erase all keys then don’t pass any array to the method.
$element_to_erase = array( 3 => null );
echo «Erasing the fourth element: » ;
$elements_left = StaticSample :: s_foo ( $element_to_erase , 1 );
print_r ( $elements_left );
echo «
» ;
echo «Enjoy!» ;

Форум

  • Open Server PanelСписок форумовОффтоп и другие темы
  • Поиск

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

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

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

Как здесь чтобы обратиться к классу через переменную . > Для этого > Имеем 2 файла + 2 класса и статические методы в них на отображение текста > [upd=1403281170][/upd]
Наверное такого не существует в природе )).
Нашел только как к методам через переменные, но это не решает нужную задачу.
http://www.php.net//manual/ru/functions . ctions.php

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

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

Index.php > Plain.php > Fly.php > FlyFast.php >

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читать еще:  Знак или в php

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

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

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

Это пока что в стадии тестирования черновой вариант, надо сделать отдельный универсальный файл/класс/метод для выполнения данных целей.
[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).

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

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

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

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

Назначение переменных в php классе

class one_class
<
function one_func ( )
<
return array ( ‘1’ , ‘2’ ) ;
>
>

class two_class extends one_class
<
var $list = array ( ) ; // норм. работа
// var $list = $this->one_func(); // PHP Parse error: syntax error, unexpected T_VARIABLE

function two_func ( )
<
return $this -> list ;
>
>

В итоге сделал так.

class one_class
<
function one_func ( )
<
return array ( ‘1’ , ‘2’ ) ;
>
>

class two_class extends one_class
<
var $list = array ( ) ;

function get_list ( )
<
$this -> list = $this -> one_func ( ) ;
>

function two_func ( )
<
return $this -> list [ 0 ] . ‘ ‘ . $this -> list [ 1 ] ;
>
>

$ob = new two_class ;
$ob -> get_list ( ) ; // заполняет переменную $list в классе актуальными значениями

Но сомнения остались. Подскажите, пожалуйста, правильное/грамотное решение такой задачи.
Коротко, чего мне было нужно: записать в переменную $list результат работы функции one_func() чтения из БД . Чтобы обращение к БД было всего одно. И уже по классу дёргать эту переменную «по сто раз» без лишних обращений к БД.

1 ответов

Не видя всего кода, трудно сказать что получилось/должно получиться.
Если у Вас запрос к БД в one_class->one_func(), то при создании каждого нового экземпляра two_class и вызове метода two_class->get_list() запрос к БД все равно будет выполняться. Если же переменная $ob, которая используется несколько раз, находится в одной области видимости — то вообще не имеет смысла мудрить с классами, можно сделать обычный запрос к БД и использовать переменную сколько угодно.
Что-то много и сумбурно написал:) В общем, если я правильно понял задачу — нужен обычный Singleton. Первое попавшееся в Яндексе, где более-менее доступно описано про этот паттерн в PHP, но все же рекомендую поискать и ознакомиться получше.

UPDATE
Код будет примерно такой:

class myClass
<
public $list = array ( ) ;

public function __construct ( )
<
// тут какой-то запрос к БД и другой код, который возвращает массив.
// для примера напишем массив «руками»
$this -> list = array ( 1 , 2 , 3 ) ;
>

// вернет просто массив
public function getListAsArray ( )
<
return $this -> list ;
>

// вернет массив, склеенный в строку с запятыми
public function getListAsString ( )
<
return implode ( ‘,’ , $this -> list ) ;
>

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

Вроде бы (вроде бы!) это предполагалось изменить в php 5.6.0.

Ссылка на основную публикацию
Adblock
detector