Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (2) 1 [2]  ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Проблема с вызовов статических методов
tceburashka.com  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 21
Пользователь №: 42890
На форуме: 7 месяцев, 11 дней
Карма: 2




Вызов статического свойства происходит так:
self:$variant

т.е. перед статическим свойством объязательно ставят знак - $
Исключения только для констант!


--------------------
Парсинг - автоматизация ручной работы. http://tceburashka.com
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
casper - gg  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Абориген
*****

Профиль
Группа: Пользователь
Сообщений: 216
Пользователь №: 42190
На форуме: 1 год, 2 дня
Карма: 10




Вспомнил, вот че:
class Test
{
public static $val;
public static $val['type']; // это строка 47

public static function browse()
{
echo self::$val;
echo self::$val['type'];
}
}


Test::browse();

выводит:
Цитата
Fatal error: Cannot redeclare Test::$val in C:\WebServers\home\biz\www\rules\test.php on line 47


no coment! :D

И вторая ситуация:
$array = array('type1', 'type2', 'type3');

class Test
{
public static $val;

public static function browse($arr)
{
foreach( $arr as $val )
echo self::$val;
}
}


Test::browse($array);


$val в переборе никакого отношения к self::$val не имеет и наоборот. так что tceburashka.com ты такой же мидл как и мы user posted image

Это сообщение отредактировал casper - gg - 26.04.2016 - 14:37
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
tceburashka.com  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 21
Пользователь №: 42890
На форуме: 7 месяцев, 11 дней
Карма: 2




Каспер Вы хоть поняли че Вы написали ?
Первый класс просто ужас. Декларировать в одном классе два одинаковых свойства, да еще и во втором свойстве сразу добавлять ключ?!!! Это просто гениально! У Вас компилятор как раз и руганулся, сказав, что Вы пытаетесь повторно объявить статическое свойство!
Во втором классе в цикле будет вызыватся постоянно статическое свойство self:$val, которое постоянно будет равно - null


--------------------
Парсинг - автоматизация ручной работы. http://tceburashka.com
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Michael  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 6065
Пользователь №: 18498
На форуме: 7 лет, 4 месяца, 10 дней
Карма: 256




Цитата (tceburashka.com @ 26.04.2016 - 12:10)
Вызов статического свойства происходит так:
self:$variant

т.е. перед статическим свойством объязательно ставят знак - $
Исключения только для констант!

Там речь не о св-ве.
В пхп можно вызывать методы через переменные, вот в доках:
http://php.net/manual/ru/functions.variabl...php#example-192


--------------------
There never was a struggle in the soul of a good man that was not hard
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
casper - gg  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Абориген
*****

Профиль
Группа: Пользователь
Сообщений: 216
Пользователь №: 42190
На форуме: 1 год, 2 дня
Карма: 10




Цитата (tceburashka.com @ 27.04.2016 - 00:04)
Каспер Вы хоть поняли че Вы написали ?

хрен редьки не слаще

class Test
{
public static $val1;
public static $val2['type'];

public static function browse()
{
echo self::$val1;
echo self::$val2['type'];
}
}


Test::browse();

Цитата
Parse error: syntax error, unexpected '[', expecting ',' or ';' in C:\WebServers\home\biz\www\rules\test.php on line 49


Если бы в таком варианте поддерживались массивы (ключи), то и тот первый скорее б сработал.
А второй вариант, это как раз и есть то что нужно было исправить ТС, вот только объявить self:$value['type'] нельзя, только self:$value.
Ну и а то что Вы имели ввиду про это:
Цитата (tceburashka.com @ 26.04.2016 - 14:10)
Вызов статического свойства происходит так:
self:$variant

- это скорее к $method адресовано, поскольку в исходнике нет $variant, то там да, справедливо:
class Test
{
public static $val1='fruit';

public static function browse()
{
echo self::$val1;
$val2=self::$val1;
echo self::$val2; // строка 54
}
}


Test::browse();

Цитата
Fatal error: Access to undeclared static property: Test::$val2 in C:\WebServers\home\biz\www\rules\test.php on line 54

а то что $ нужно ставить перед именем переменной, - это не к месту

Это сообщение отредактировал casper - gg - 27.04.2016 - 08:37
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1755
Пользователь №: 20757
На форуме: 6 лет, 10 месяцев, 5 дней
Карма: 184




Цитата (Zzepish @ 25.04.2016 - 16:05)
Кто вкурсе- в чем косяк?

Косяк в том, что если это прокатывало в php <= 5, то в 7 уже нет. И нужно правильно писать:
 elseif(!(self::{$value['type']}($errorTypesLog[$key])))

Цитата (casper - gg @ 27.04.2016 - 04:24)
Если бы в таком варианте поддерживались массивы (ключи), то и тот первый скорее б сработал.

Какой-то бред. В первом примере ты пытаешься объявить дважды одно свойство, во втором - ошибка синтаксиса. Поскольку обе ошибки фатальны, то в первом случае "очередь" до syntax error попросту не доходит, потому что скрипт падает уже на Cannot redeclare
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
casper - gg  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Абориген
*****

Профиль
Группа: Пользователь
Сообщений: 216
Пользователь №: 42190
На форуме: 1 год, 2 дня
Карма: 10




kaww, чего то точно не понимаю, как сделать так что бы self::{$value['type']} существовала? версия 5.6
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
casper - gg  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Абориген
*****

Профиль
Группа: Пользователь
Сообщений: 216
Пользователь №: 42190
На форуме: 1 год, 2 дня
Карма: 10




о! блин, понял, это же обозначение метода - self::{$value['type']}();
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1755
Пользователь №: 20757
На форуме: 6 лет, 10 месяцев, 5 дней
Карма: 184




Цитата (casper - gg @ 27.04.2016 - 05:31)
как сделать так что бы self::{$value['type']} существовала?

В $value['type'] имя метода, т.е. метод этот должен быть объявлен в классе:
class Filter {
public static function call($conf, $value)
{
foreach ($conf as $_conf) {
$value = self::{$_conf['type']}($value);//У Zzepish проблема здесь
}
return $value;
}

public static function foo($value)
{
return $value . ':foo';
}

public static function bar($value)
{
return $value . ':bar';
}
}


$conf = [['type' => 'foo'], ['type' => 'bar']];
echo Filter::call($conf, 'Test');


З.Ы. пока писал, ты сам разобрался
PMПисьмо на e-mail пользователю
    2   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
casper - gg  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Абориген
*****

Профиль
Группа: Пользователь
Сообщений: 216
Пользователь №: 42190
На форуме: 1 год, 2 дня
Карма: 10




kawwдействительно, что-то я совсем не о том, спасибо. Выходит если это имя метода то self - сработает, а если свойство, то нет:
class Test
{
public static function browse()
{
$val['type'] = 'year';
self::{$val['type']}(); // здесь работает
}

public static function year()
{
echo 'Its new year';
$var['day'] = 'monday';
echo self::$var['day']; // а здесь уже нет
}
}


Test::browse();

и фигурные скобки {}, подразумевают такой синтаксис {name method}();

Это сообщение отредактировал casper - gg - 27.04.2016 - 09:54
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Zzepish  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Аццкая хрень
******

Профиль
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 5475
Пользователь №: 32538
На форуме: 4 года, 6 месяцев, 11 дней
Карма: 49




kaww
Первый вменяемый совет по делу. Огромное спасибо. Я как-раз сейчас осваиваю php7


--------------------
Правда тоже ложь, но с иным углом.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
tceburashka.com  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 21
Пользователь №: 42890
На форуме: 7 месяцев, 11 дней
Карма: 2




Каспер. ключи могут использоватся, надо только правильно делать:

public static $val = array('type'=>null);

Так происходит объявление с предустановленным массивом.
Ошибка была в двойном объявленнии в первом случае, а во-втором неверное использование. Впрочем Вам и так понятно разъяснил kaww.
$variant - я специально назвал таким именем, что бы подчеркнуть, что это свойство является переменной. А вызов статических свойств осуществляется с использованием - знака - $
Замечу, я бы вместо:
public static function call($conf, $value)
{
foreach ($conf as $_conf) {
$value = self::{$_conf['type']}($value);//У Zzepish проблема здесь
}
return $value;
}

Написал бы:
public static function call(array $conf, $value)
{
foreach ($conf as $_conf) {
if(!empty($_conf['type']))
{
$meth = $_conf['type'];
switch($meth)
{
case 'foo': $value=self:foo($value);
break;
case 'bar': $value=self:bar($value);
break;
default: throw new Exception('Выполнение неизвестного метода ',1);
}
}
}
return $value;
}


безопасность превыше всего! Лучше сразу приучать себя к проверкам, иначе код будет быстрым, но дырявым.


--------------------
Парсинг - автоматизация ручной работы. http://tceburashka.com
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
casper - gg  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Абориген
*****

Профиль
Группа: Пользователь
Сообщений: 216
Пользователь №: 42190
На форуме: 1 год, 2 дня
Карма: 10




Цитата (tceburashka.com @ 28.04.2016 - 00:09)
Каспер. ключи могут использоватся, надо только правильно делать:

public static $val = array('type'=>null);


не знал про это, спасибо
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
tceburashka.com  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 21
Пользователь №: 42890
На форуме: 7 месяцев, 11 дней
Карма: 2




Незачто. Удачи!


--------------------
Парсинг - автоматизация ручной работы. http://tceburashka.com
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (2) 1 [2]  Ответ в темуСоздание новой темыСоздание опроса