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 :: Как правильно запускать функцию? [2]

 PHP.SU

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


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

> Без описания
Мелкий Супермодератор
Отправлено: 25 Апреля, 2015 - 11:47:47
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




gheka пишет:
Но если вы внимательно смотрели примеры то у меня и написано с использованием mysqli

А, точно. Простите, сагрился на пример DeepVarvar'а.
Для mysqli доступны штатные методы по работе с транзакцией, примеры посмотрите: http://php.net/manual/en/mysqli.commit.php

gheka пишет:
А переделывать это целая история, так как у меня скрипт в 200-300 файлов

И что? Все гвоздями прибиты к myisam?
Разделение в mysql подключаемых стораджей вообще удивительнейшая идея для субд, из-за которой архитектурно появляется куча костылей и многое работает крайне странно. Но переезд с myisam на innodb проходит обычно тихо и спокойно, особенно если специально не пытались отстрелить себе ногу. И позволяет обойти огромнейшее число граблей в поддержке и производительности.
Лично перетаскивал небольшой проект в ~50к строк PHP-кода (если в файлах считать - чуть меньше 500) с myisam на innodb - модификации кода не потребовалось. Вот обратно - да, будет больно. Но зачем?


-----
PostgreSQL DBA
 
 Top
Sail
Отправлено: 25 Апреля, 2015 - 12:15:06
Post Id



Участник


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


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




gheka, Вы уверены, что в таблице заказов (order) поле id однозначно указывает именно на идентификатор счёта (invoices), а не заказа?
Логично предположить, что в таблице order есть поле с названием, похожим на `id_invoice`... или ещё какая-нить связь между заказом и счётом...
 
 Top
DeepVarvar Супермодератор
Отправлено: 25 Апреля, 2015 - 12:35:32
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




Мелкий пишет:
То что это работает, не означает, что так можно делать
Ой-ли? А как насчет автолоада? Сначала происходит вызов, а потом подтягивается и интерпретируется функционал ))
 
 Top
gheka
Отправлено: 25 Апреля, 2015 - 12:47:16
Post Id



Частый гость


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


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




Sail пишет:
gheka, Вы уверены, что в таблице заказов (order) поле id однозначно указывает именно на идентификатор счёта (invoices), а не заказа?
Логично предположить, что в таблице order есть поле с названием, похожим на `id_invoice`... или ещё какая-нить связь между заказом и счётом...


Да нет в таблице ORDER есть естественно свой ID это просто чисто пример, и переменные придуманы от балды.

Мелкий пишет:
Для mysqli доступны штатные методы по работе с транзакцией, примеры посмотрите: http://php.net/manual/en/mysqli.commit.php


Спасибо почитаю.

Мелкий пишет:
И что? Все гвоздями прибиты к myisam?
Разделение в mysql подключаемых стораджей вообще удивительнейшая идея для субд, из-за которой архитектурно появляется куча костылей и многое работает крайне странно. Но переезд с myisam на innodb проходит обычно тихо и спокойно, особенно если специально не пытались отстрелить себе ногу. И позволяет обойти огромнейшее число граблей в поддержке и производительности.
Лично перетаскивал небольшой проект в ~50к строк PHP-кода (если в файлах считать - чуть меньше 500) с myisam на innodb - модификации кода не потребовалось. Вот обратно - да, будет больно. Но зачем?


Да нет, переделать таблицу из MYISAM в INNOBD это думаю не составит труда. Другое дело перейти на PDO так как давно использовал просто MYSQL и не давно только перешёл на MYSQLI весь скрипт перелопатил. Надо было сразу PDO смотреть, просто не привычный стиль и много чего уже не помню из него. Но почитав про PDO выходит, что он не намного отличается от MYSQLI но всё же больше развития происходит с ним. Так что буду подумаю о переходе на PDO
 
 Top
dcc0
Отправлено: 25 Апреля, 2015 - 13:22:35
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


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




DeepVarvar, разбор все равно должен происходить построчно - читай последовательно.

А так получается, если вызов в начале, на первых стадиях разбора найден вызов, функции, а потом через нн-ое число строк найдено само тело функции... Не порядок.

(Отредактировано автором: 25 Апреля, 2015 - 13:26:22)



-----
Март 2021. Бросил программирование
 
 Top
DeepVarvar Супермодератор
Отправлено: 25 Апреля, 2015 - 13:58:16
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




dcc0 сначала разбирается ВЕСЬ файл (ну или куча склееных инклюд), а уже потом идет рантайм выполнение.
В js, кстати, то же самое.
Естессно нет никакой нужды имплементировать "рутины" до их вызова, это тебе не си.

Да и в сях можно сначала только задекларировать, а потом в самом низу имплементировать.
 
 Top
dcc0
Отправлено: 25 Апреля, 2015 - 14:16:33
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


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




DeepVarvar, прекрасно, осталось разобраться, как разбирается. Берем начало - Лексический анализ.

Идем в Википедию:
https://ru[dot]wikipedia[dot]org/wiki/Лексический_анализ
Цитируем:

"На первой стадии, сканировании, лексический анализатор обычно реализуется в виде конечного автомата, определяемого регулярными выражениями..."

Сканирование все равно последовательно.

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

И вот вопрос влияет ли или не влияет вызов в начале на скорость разбора?
Так как по идее больше ни на что влиять не должен.
Подождем Мелкого.


-----
Март 2021. Бросил программирование
 
 Top
DeepVarvar Супермодератор
Отправлено: 25 Апреля, 2015 - 14:23:25
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. test();
  4.  
  5. function test()
  6. {
  7.     $x = 2 * 2;
  8. }

Ну или наоборот.
А вот пускалка:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. $start = microtime(true);
  4. $x = 100;
  5. while ($x--) {
  6.     exec('php ./test.php');
  7. }
  8. echo (microtime(true) - $start) . PHP_EOL;

Разницы нет.
(Добавление)
Improved!

Генерация:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3.  
  4. $decl = '';
  5. $runs = '';
  6.  
  7. $x = 10000;
  8. while ($x--) {
  9.     $decl .= ' function test' . $x . '(){ $x = 2 * 2; }';
  10.     $runs .= ' test' . $x . '();';
  11. }
  12.  
  13.     './test-run.php',
  14.     '<?PHP $start = microtime(true);'
  15.         . $runs // <- меняем местами
  16.         . $decl // <- меняем местами
  17.         . ' echo (microtime(true) - $start) . PHP_EOL;'
  18. );

Та же шляпа -- профита нет.
 
 Top
dcc0
Отправлено: 25 Апреля, 2015 - 14:50:55
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


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




From official documentation:

Цитата:
Functions need not be defined before they are referenced,


"Кроме случаев, когда функции определены условно"

И сразу же ниже
Цитата:
All functions and classes in PHP have the global scope - they can be called outside a function even if they were defined inside and vice versa.


Но нестрогое следование одному правилу....

Там же в примере, работает:

PHP:
скопировать код в буфер обмена
  1.  
  2. foo();
  3. bar();
  4. function foo()
  5. {
  6.   function bar()
  7.   {
  8.     echo "I don't exist until foo() is called.\n";
  9.   }
  10. }
  11.  


....Может привести к такому, рано или поздно:

PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. bar();
  4.  
  5. function foo()
  6. {
  7.   function bar()
  8.   {
  9.     echo "I don't exist until foo() is called.\n";
  10.   }
  11. }
  12.  
  13. foo();


Call to undefined function
(Добавление)
В принципе в документации есть противоречие между утверждением и вот этим примером:
Так как в нем bar вызывается ровно так же, как это у автора.


Спойлер (Отобразить)


Ждем товарища Мелкого.

(Отредактировано автором: 25 Апреля, 2015 - 14:56:55)



-----
Март 2021. Бросил программирование
 
 Top
DeepVarvar Супермодератор
Отправлено: 25 Апреля, 2015 - 15:03:43
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




dcc0 пишет:
Может привести к такому, рано или поздно
Это уже жесть какая-то. Надо быть на всю голову больным -- так писать..
 
 Top
dcc0
Отправлено: 25 Апреля, 2015 - 15:15:03
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


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




DeepVarvar, но большинство вопросов, с которыми приходят люди, недалеки от этого и ошибки обычно ... не буду примеры приводить.
Неужели ты не делал ошибок, над которыми смеялся потом?

Но это ладно, вопрос человеческого фактора.
И да, факт - утверждение, как надо вызывать функции и пример вызова из официальной документации ОДНОЗНАЧНО ПРОТИВОРЕЧАТ.
Так что не одни пользователи php виноваты в таком количестве непонятного кода.


Второй вопрос - обращения к памяти на низком уровне, если вызов в начале, а функция на 900-ой строке. Как и на что влияет?! Вопрос, имхо, открыт.
Тема работы транслятора (компилятора и интерпретатора) не раскрыта.

(Отредактировано автором: 25 Апреля, 2015 - 15:17:42)



-----
Март 2021. Бросил программирование
 
 Top
DeepVarvar Супермодератор
Отправлено: 25 Апреля, 2015 - 15:27:51
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




dcc0 пишет:
а функция на 900-ой строке
Второй тест же именно про это.
dcc0 пишет:
над которыми смеялся потом?
До сих пор ржу: http://www.phpfaq[dot]ru/forum/thread.php?id=59
 
 Top
Мелкий Супермодератор
Отправлено: 27 Апреля, 2015 - 17:08:21
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




dcc0 пишет:
Ждем товарища Мелкого.

А я думаю, пилю и сверлю. Хм, надо перечитать понаписанное.

DeepVarvar пишет:
А как насчет автолоада? Сначала происходит вызов, а потом подтягивается и интерпретируется функционал ))

Принято. Это рантайм. Сейчас, по крайней мере.

dcc0 пишет:
Второй вопрос - обращения к памяти на низком уровне, если вызов в начале, а функция на 900-ой строке. Как и на что влияет?!

До размещения в памяти ещё гулять и гулять по абстракциям. JIT только в PHP7, для начала опкоды.

dcc0 пишет:
И вот вопрос влияет ли или не влияет вызов в начале на скорость разбора?

Не влияет, т.к. PHP интерпретатор компилирующего типа. Сначала весь файл целиком компилируется в опкод, затем исполняется. Если вызывает include - то компилирует его и исполняет.

Но, просто попробуйте выполнить:
PHP:
скопировать код в буфер обмена
  1. class C extends B { }
  2. class B extends A { }
  3. class A { }


-----
PostgreSQL DBA
 
 Top
Страниц (2): « 1 [2]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB