Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Что означает следующая конструкция...

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
nkl
Отправлено: 05 Марта, 2014 - 22:31:49
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




PHP:
скопировать код в буфер обмена
  1. defined('SYSPATH') or exit('Install tests must be loaded from within index.php!');

Поправьте если я ошибаюсь: "Если не объявлена константа SYSPATH, то происходит выход из скрипта с сообщением Install tests must be loaded from within index.php!";

То же самое можно описать следующим, более понятным для меня образом:
PHP:
скопировать код в буфер обмена
  1. if(!defined('SYSPATH'))
  2.         die('Install tests must be loaded from within index.php!');


В чем разница между первым и вторым способом и какой из способов преимущественно использовать в повседневной работе?
Растерялся
 
 Top
OrmaJever Модератор
Отправлено: 05 Марта, 2014 - 22:41:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




впервые вижу что бы проверку константы делали первым способом, но судя по всему он имеет место быть.
В первом случае оператор or выполняет вначале левую часть условия, если она true то условие будет true и нету смысла выполнять правую часть, если же false то выполняется правая часть, такой вот лайф хак Подмигивание
А так оба условия делают одну и туже функцию.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
MAXUS
Отправлено: 06 Марта, 2014 - 04:46:36
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




Ухты... Прикольно...

Единственное, обе половины or должны что-то возвращать. А так, интересно можно использовать... И не только с or... Например:

PHP:
скопировать код в буфер обмена
  1.  
  2. function warning(){
  3.         echo "Установлены не все необходимые переменные";
  4. }
  5. $test=$test1=true;
  6. //$test2=true; //При закоментированном получим предупреждение, что не все переменные установлены. Если раскоментировать, то предупреждения не будет...
  7. $test and $test1 and $test2 or warning();
  8.  


А вот следующее не сработает:

PHP:
скопировать код в буфер обмена
  1.  
  2. $test or echo "Переменная test не заполнена";
  3.  


Потому что echo это не функция...

Кмк, подход имеет все права на использование. И я дак, например, признателен автору поста за такой экспириенс.

Что удивительно, ведь фишка на поверхности лежалаУлыбка

Добавление
А еще прикольнее...

PHP:
скопировать код в буфер обмена
  1.  
  2. do_step1() and do_step2() and do_step3() or exit("А не все шаги выполнены как следует:)");
  3.  


или например

PHP:
скопировать код в буфер обмена
  1.  
  2. function run($file){
  3.         include $file;
  4.         return true;
  5. }
  6. (file_exists("file1.php") and $file="file1.php" or file_exists("file2.php") and $file="file2.php") and run($file) or  exit ("Что-то пошло не так!");
  7.  

(Отредактировано автором: 06 Марта, 2014 - 05:41:25)

 
 Top
nkl
Отправлено: 06 Марта, 2014 - 08:02:46
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




Спасибо за пояснения, рад, что тема оказалась полезной. Да это я давеча решил кохану по кирпичикам разобрать до фнудамента, вот сижу и разбираю print-ером и die()'ем. И вдруг встречаю такие вот непонятные мне конструкции, доселе мною неиспользуемые. Если что непонятного нарою, будут в этой теме спрашивать.
 
 Top
DelphinPRO
Отправлено: 06 Марта, 2014 - 08:58:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




OrmaJever пишет:
впервые вижу что бы проверку константы делали первым способом, но судя по всему он имеет место быть

В джумле каждый файл начинается с defined('_JEXEC') or die;
Улыбка
А в javascript такие конструкции вообще на каждом шагу... странно что не встречали ранее. )

MAXUS фишка прикольная и удобная, но не надо фанатизма Улыбка


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Ch_chov
Отправлено: 06 Марта, 2014 - 09:42:27
Post Id



Постоянный участник


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


Помог: 90 раз(а)




DelphinPRO пишет:
А в javascript такие конструкции вообще на каждом шагу...

Они только с виду похожи. В PHP результат логической операции всегда имеет тип bool. Поэтому такой вот трюк в PHP не работает:

CODE (javascript):
скопировать код в буфер обмена
  1. var foo = function(param) {
  2.   param = param || 'default value';
  3. }

(Отредактировано автором: 06 Марта, 2014 - 09:50:15)

 
 Top
MAXUS
Отправлено: 06 Марта, 2014 - 10:57:02
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




DelphinPRO пишет:
MAXUS фишка прикольная и удобная, но не надо фанатизма Улыбка


Да это не фанатизмУлыбка Это демонстрация возможностей для углубленного пониманияУлыбка В том числе и себе самому.
 
 Top
nkl
Отправлено: 10 Марта, 2014 - 22:32:37
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




Столкнулся с новым, до селе невиданным мною выражением, вот оно:
PHP:
скопировать код в буфер обмена
  1. Kohana::$profiling = (bool) $settings['profile']

Что означает этот (bool) здесь?
 
 Top
OrmaJever Модератор
Отправлено: 10 Марта, 2014 - 22:38:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




банальное приведение типов. Переменная приводится к логическому типу.
(Добавление)
можно ещё и завуалировать Закатив глазки
PHP:
скопировать код в буфер обмена
  1. Kohana::$profiling = !! $settings['profile']


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
nkl
Отправлено: 10 Марта, 2014 - 22:43:06
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




Кажись я понял. var_dump ((bool) '') вернет нам bool(false), но var_dump ('') вернет нам string(0) ""; В данном случае это делается для явного указания типа данных который храниться в переменной $settings['profile'], так? Хотя если мы запишем в неё true, то делать это не обязательно, хотя с другой стороны, если мы сделаем так $settings['profile'] = '', то используя (bool)$settings['profile'] мы получим bool(false). Поправьте если я ошибаюсь. Растерялся
(Добавление)
Ох ты ж епт! Ни х себе я открытие для себя сделал! Так это даже если написать так var_dump((bool) 'asdasd') нам вернется bool(true)!!!
(Добавление)
Это все конечно хорошо, только я вот не пойму дальнейшего смысла проверок... Вот например таких:
PHP:
скопировать код в буфер обмена
  1. if (isset($settings['errors']))
  2. {
  3.         // Enable error handling
  4.         Kohana::$errors = (bool) $settings['errors'];
  5. }
  6.  
  7. if (Kohana::$errors === TRUE)
  8. {
  9.         // Enable Kohana exception handling, adds stack traces and error source.
  10.         set_exception_handler(array('Kohana_Exception', 'handler'));
  11.  
  12.         // Enable Kohana error handling, converts all PHP errors to exceptions.
  13.         set_error_handler(array('Kohana', 'error_handler'));
  14. }


Почему бы не написать просто if (Kohana::$errors) ? Или это своего рода защита от того, что в переменную Kohana::$errors может быть записано что-то кроме булевого TRUE или FALSE?
 
 Top
OrmaJever Модератор
Отправлено: 10 Марта, 2014 - 23:02:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




nkl пишет:
Кажись я понял. var_dump ((bool) '') вернет нам bool(false), но var_dump ('') вернет нам string(0) ""; В данном случае это делается для явного указания типа данных который храниться в переменной $settings['profile'], так? Хотя если мы запишем в неё true, то делать это не обязательно, хотя с другой стороны, если мы сделаем так $settings['profile'] = '', то используя (bool)$settings['profile'] мы получим bool(false). Поправьте если я ошибаюсь.

конечно правильно.
nkl пишет:
Ох ты ж епт! Ни х себе я открытие для себя сделал! Так это даже если написать так var_dump((bool) 'asdasd') нам вернется bool(true)!!!

В этом и есть весь смысл приведения типов в php, с одной стороны он странный, с другой логичный.
nkl пишет:
Почему бы не написать просто if (Kohana::$errors) ? Или это своего рода защита от того, что в переменную Kohana::$errors может быть записано что-то кроме булевого TRUE или FALSE?

в данному куске кода видимых причин на приведения в логический тип нет, но наверное на то были причины (это я хоть как-то оправдываю разработчиков фреймворков Ха-ха )


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
nkl
Отправлено: 10 Марта, 2014 - 23:11:50
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




Спасибо за пояснения. Теперь я могу идти спать, до завтрашних открытий Радость
 
 Top
OrmaJever Модератор
Отправлено: 10 Марта, 2014 - 23:34:49
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)





nkl пишет:
Теперь я могу идти спать, до завтрашних открытий

ох уж этот суровый мир, он так богат на открытия Закатив глазки


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
nkl
Отправлено: 13 Марта, 2014 - 22:37:19
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




Еще раз приветствую. В продолжении темы, хотелось бы спросить. Что значит self:: ? Например, вот тут оно используется:
PHP:
скопировать код в буфер обмена
  1. class Autoloader
  2. {
  3.     private static $_lastLoadedFilename;
  4.  
  5.     public static function loadPackages($className)
  6.     {
  7.         $pathParts = explode('_', $className);
  8.         self::$_lastLoadedFilename = implode(DIRECTORY_SEPARATOR, $pathParts) . '.php';
  9.         require_once(self::$_lastLoadedFilename);
  10.     }
  11.  
  12.     public static function loadPackagesAndLog($className)
  13.     {
  14.         self::loadPackages($className);
  15.         printf("Class %s was loaded from %sn", $className, self::$_lastLoadedFilename);
  16.     }
  17. }
 
 Top
OrmaJever Модератор
Отправлено: 13 Марта, 2014 - 22:42:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




обращение к статическим свойствам/методам текущего класса. сюда же можно добавить parent:: и static::, если где-то будете встречать то знайте что это из одной оперы.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB