Гость
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Видимость внутри функции переменных / 25 сообщений из 50, страница 1 из 2
07.09.2018, 11:04
    #39699435
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
require_once 'task_maind.php';
$gl_task = $task; // $task определен в require_once 'task_maind.php'. Не видит. Попробовал переопределить как $gl_task - не видит
$aaa = 125; // пробую напрямую - не видит
function CheckTask( $kodtask, $condition ){
    global $aaa; // не работает
    global $gl_task, $mysttask; // не работает
    $st = $mysttask[$gl_task[$kodtask][id]];
    print_r($gl_task); echo "<br>"; // ничего не возвращает
    echo $GLOBALS[aaa]."<br>"; // ничего не возвращает
    echo $aaa."<br>"; // ничего не возвращает
}
CheckTask('g1i1', $tsk_row[land]>0);




У кого небудь було подобное ?
Сначало я подумал что есть разница между require и include, но самое главное, что в другом месте код с global работает отлично.
Я начинаю сходить с ума.
...
Рейтинг: 0 / 0
07.09.2018, 12:13
    #39699525
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
Андрей159в другом месте код с global работает отличноЧем это место отличается от другого?
А вообще, больше похоже на глюк какой-то. Проверьте на всякий случай, действительно ли перед вызовом функции переменные определены.
...
Рейтинг: 0 / 0
07.09.2018, 12:17
    #39699529
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
содержимое этого файла запускается из одной функции. при ее выполнении загружается нужный require_once и запускается снова новая функция уже загруженного только что require. В нем есть содержимое что описано выше. И переменная не видится как глобальная никак. Но если взять любые переменные перед этим, то через глобал они видятся. Не видятся все переменные которые находятся внутри функции1, функции2, в самом файле который подгружен. В общем идея моя была проста - подключать файлы только по необходимости, но как я вижу это не работает. В мануалах не нахожу ничего подобного. Или просто баг, или никто так не делал. Но в мануале никаких предостережений.
...
Рейтинг: 0 / 0
07.09.2018, 12:19
    #39699531
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
попробую переписать как класс с динамическим подключением по событии вызова. Посмотрю как поведет себя. Подключать все подряд без надобности тоже не выход.
...
Рейтинг: 0 / 0
07.09.2018, 12:26
    #39699537
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
пробовал искать различия между include и require
потом думал может что-то с памятью. Движок DLE. Переменная $member_id без всяких проблем в глобал видит. Все новое что не напишу никак.
...
Рейтинг: 0 / 0
07.09.2018, 12:32
    #39699545
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
Андрей159загружается нужный require_onceтолько при условии, что данный файл не был подключен ранее.

Андрей159и запускается снова новая функция уже загруженного только что require.Нифига не понятно, но, надеюсь, речь идет о разных файлах.

Андрей159Не видятся все переменные которые находятся внутри функции1, функции2, в самом файле который подгружен.Не понял, кто на ком лежал... Вы хотите передать переменные из вызывающего скрипта внутрь функции или Вы хотите передать локальные переменные функции в вызывающий скрипт?

Андрей159В общем идея моя была проста - подключать файлы только по необходимости, но как я вижу это не работает.Видимо, не работает в конкретном Вашем случае. Гадание тут вряд ли поможет, так что, займитесь отладкой. Есть подозрение, что вывод ошибок отключен, потому Вы чего-то не видите.

Андрей159пробовал искать различия между include и requireРазличия только в продолжении или прекращении работы скрипта при неудачном подключении файла.
...
Рейтинг: 0 / 0
07.09.2018, 13:02
    #39699570
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
Андрей159
Код: php
1.
$gl_task = $task; // $task определен в require_once 'task_maind.php'. Не видит. Попробовал переопределить как $gl_task - не видит


ну это бред. вы - рукожоп.

Модератор:
полудух , выбирайте выражения!
...
Рейтинг: 0 / 0
07.09.2018, 13:06
    #39699573
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
"полудух", спасибо что пришел
to vkle, вот схема
...
Рейтинг: 0 / 0
07.09.2018, 13:17
    #39699586
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
1. Загружается ядро DLE
2. Все легкие функции лежат в function.php
3. При (например) сохранении профиля или страницы возле запроса mysql UPDATE дальше вызывается save_to_events(параметры)
4. save_to_events находится в function.php и подгружает через require_one('events.php') и выполняет также функцию save_event(...) которая в events.php. Вначале выполняется код загружен в require_one('events.php'), потом разумеется выполняется функция save_event.
5. В функции save_event в конце просто подключаю require_one('task_condition.php'). никаких вызов функций отсюда.
6. Функция находится внутри task_condition.php и запускается там же из этого файла. И там видимость через global к $member_id есть а к моим любим переменным нет.
Вот и вся история
...
Рейтинг: 0 / 0
07.09.2018, 13:22
    #39699592
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
переменная лежит прямо возле функции просто за ее пределами. и не видится. тоесть я думал о global в каждой предыдущей функции, но здесь это не уместно. Должно было так работать.
...
Рейтинг: 0 / 0
07.09.2018, 13:27
    #39699597
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
вывод ошибок не отключен. не ругается просто так
...
Рейтинг: 0 / 0
07.09.2018, 13:50
    #39699618
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
Андрей1592. Все легкие функции лежат в function.php
3. При (например) сохранении профиля или страницы возле запроса mysql UPDATE дальше вызывается save_to_events(параметры)
4. save_to_events находится в function.php и подгружает через require_one('events.php') и выполняет также функцию save_event(...) которая в events.php. Вначале выполняется код загружен в require_one('events.php'), потом разумеется выполняется функция save_event.
5. В функции save_event в конце просто подключаю require_one('task_condition.php'). никаких вызов функций отсюда.
6. Функция находится внутри task_condition.php и запускается там же из этого файла. И там видимость через global к $member_id есть а к моим любим переменным нет.

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

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?php
// файл function.php

$myvar  = 'myvalue'; // любимая переменная

save_to_events();

function save_to_events() {
  require_once('events.php');
  save_event();
}



Код: php
1.
2.
3.
4.
5.
6.
<?php
// файл events.php

function save_event() {
  require_once('task_condition.php');
}



Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
<?php
// файл task_condition.php

function my_function() {
  global $myvar;
  var_dump($myvar); // контроль переменной
}

my_function();
...
Рейтинг: 0 / 0
07.09.2018, 14:06
    #39699632
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
Из вашего примера все вроде бы верно,

вот только "любимая переменная" как не удивительно будет работать даже несмотря на то, что отсутствует global внутри первой функции function save_to_events() {.

то-есть в самом PHP который подключает внутри функции через require сам код php видит переменные. Немножко странно, но мне не мешает.

Вот как вы представили пример, не будет работать в последнем task_condition.php
скрипт PHP работает, все видит прекрасно.
Перед функцией в task_condition.php я пишу $МояНоваяПеременная = 1;

Парадокс вот в чем:
Код: php
1.
2.
3.
4.
$МояНоваяПеременная = 1
function my_function() {
  global $myvar;// Будет работать
  global $МояНоваяПеременная; // не работает
...
Рейтинг: 0 / 0
07.09.2018, 14:09
    #39699635
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
Давайте на вашем примере покажу:
[quot vkle]Андрей159
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?php
// файл function.php

$myvar  = 'myvalue'; // любимая переменная

save_to_events();

function save_to_events() {
  require_once('events.php');
  save_event();
}



Код: php
1.
2.
3.
4.
5.
6.
<?php
// файл events.php

function save_event() {
  require_once('task_condition.php');
}



Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<?php
// файл task_condition.php

$mynewvar = 'Пожалуйста работай';
function my_function() {
  global $myvar;
  var_dump($myvar); // контроль переменной - ЗАРАБОТАЕТ
  global $mynewvar;
  var_dump($myvar); // НЕ РАБОТАЕТ
}

my_function();
...
Рейтинг: 0 / 0
07.09.2018, 14:11
    #39699638
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
Я вернусь к этому вопросу. Возможно найду причину. Если найду, напишу. Вопрос сложный оказался. 4 часа на него потратил. Сейчас выход какой-то другой найду. Это не проблема. Но все же очень интересно. Загадка.
...
Рейтинг: 0 / 0
07.09.2018, 14:15
    #39699644
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
Модератор, ты меня конечно прости, но если выбирать выражения, когда чел - рукожоп, то он ничему не научится.
Я просто называю вещи своими именами.
когда вот так вызываешь ячейку массива, то ты - рукожоп:
Код: php
1.
$st = $mysttask[$gl_task[$kodtask][id]];


надо вот так:
Код: php
1.
$st = $mysttask[$gl_task][$kodtask]['id'];



когда лезешь в массив через константы, то опять же - рукожоп ты:
Код: php
1.
echo $GLOBALS[aaa]."<br>"; // ничего не возвращает


ну а с чего бы ему возвращать то?? Он же красным по белому подсказывает: "Use of undefined constant aaa - assumed 'aaa' in ..."

и если вот так отдавать переменную в ф-ю, то туда придёт boolean (на всякий случай, а то вдруг там ждут какое-то значение):
Код: php
1.
2.
CheckTask('g1i1', $tsk_row[land] > 0);
$tsk_row['land'] > 0 // будет true / false



студент с выключенными ошибками наговнокодил непойми что и ждёт манны небесной
рисует картинки
собрал пол-форума
а самое страшное, что никто на сами ошибки ему тут не указывает

Модератор: Когда Вы пишите "так неправильно, надо так" - вопросов нет - указали на ошибки. Но когда Вы вешаете ярлыки без каких-либо внятных комментариев - это, извините, кроме как хамством назвать сложно.
К ошибочности терминологии пользователя Андрей159 у меня тоже немало претензий. В частности там, где echo ... // ничего не возвращает. Согласно документации, echo действительно ничего не возвращает, и это абсолютно нормально. Тем более, что и возвращать то некуда. Но автор, возможно, документацию читает по диагонали и имел в виду, вероятно, что-то другое. Скорее всего, правильно читать "ничего не выводит" или "не печатает".

полудуха самое страшное, что никто на сами ошибки ему тут не указывает Увы, Вы в этом топике тоже включились совсем не с указания на ошибки.
--
vkle
...
Рейтинг: 0 / 0
07.09.2018, 14:20
    #39699650
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
Ясно-понятно.
При таком раскладе $mynewvar становится локальной переменной функции save_event(), а не глобальной переменной скрипта.
По идее, так должно работать:
Код: php
1.
2.
3.
4.
5.
6.
7.
<?php
// файл events.php

function save_event() {
  global $mynewvar;
  require_once('task_condition.php');
}
...
Рейтинг: 0 / 0
07.09.2018, 14:52
    #39699676
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
to "полудух",
Уважаемый, вы застряли на старых версиях. В новой версии можно и не такое делать. Я не успеваю 7,2 полностю освоить, а вы мне вспоминаете о грехах PHP 5.3. А вы знаете что в 5,3 это будет вообще синтаксической ошибкой? В 5,6 это работает. в скобках "двойной_масив[1][2]" не проскочит, если не добавить ['2'], но в {} пройдет. Нужно каждый год учить что-то если не хотите живот отрастить как в папика. Стремитесь, учитесь, язык английский к примеру, в качалку сходите. Работы много, не успеете менять. Зарплаты какие. Конечно каждого нудика туда не берут. API Google, Facebook, VK, OK, Instagram освоите - это только один из 10 нужных пунктиков. Удачи.
...
Рейтинг: 0 / 0
07.09.2018, 15:09
    #39699696
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
"полудух"
Извени, не обижайся. В новых версиях можно так писать. Это уже не ошибка, а наверное норма.
...
Рейтинг: 0 / 0
07.09.2018, 15:43
    #39699725
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
Заработало, когда в предыдущей функции также указал тот же global. На уровне корневой логики PHP не все понятно, но уже хоть знаю как если что бороться с этим. Спасибо за помощь.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
<?php
// файл function.php

save_to_events();

function save_to_events() {
  require_once('events.php');// Здесь не обязательно
  save_event();
}



Код: php
1.
2.
3.
4.
5.
6.
7.
<?php
// файл events.php

function save_event() {
  global $myvar; // Здесь тоже нужно обязательно объявить (до конца не понял почему, но работает)
  require_once('task_condition.php');
}



Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<?php
// файл task_condition.php

$myvar = 'Заработаю если объявишь меня также раньше';
function my_function() {
  global $myvar;
  var_dump($myvar); // РАБОТАЕТ
}

my_function();
...
Рейтинг: 0 / 0
07.09.2018, 15:50
    #39699734
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
видимо когда функция в функции, то нужно в начале родительской функции обязательно указывать global .
require просто расширяет функцию
в дочерной тоже указываем global и только тогда переменная видится.
Не видел мануалы именно с такой ситуацией и объяснениями.
...
Рейтинг: 0 / 0
07.09.2018, 15:54
    #39699738
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
что характерно, что если в подключаемом php
написать global, то не работает. А это значит, что функция вовсе не расширяется (это я себе придумал).
Нужно именно в предыдущей функции прописать в global. Так работает. Не пойму до конца почему. Ну да ладно. Буду помнить.
...
Рейтинг: 0 / 0
07.09.2018, 16:01
    #39699744
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
Андрей159 На уровне корневой логики PHP не все понятно Не надо искать сложности там, где их нет. Как раз, на этом уровне всё предельно просто. Возьмите непосредственно код включаемого файла и поместите его вместо строчки include. Где оказалась Ваша переменная? ;-)

Остальное написано в разделе руководства про область видимости переменных.
...
Рейтинг: 0 / 0
07.09.2018, 16:03
    #39699748
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
Андрей159to "полудух",
Уважаемый, вы застряли на старых версиях. В новой версии можно и не такое делать. Я не успеваю 7,2 полностю освоить, а вы мне вспоминаете о грехах PHP 5.3. А вы знаете что в 5,3 это будет вообще синтаксической ошибкой? В 5,6 это работает. в скобках "двойной_масив[1][2]" не проскочит, если не добавить ['2'], но в {} пройдет. Нужно каждый год учить что-то если не хотите живот отрастить как в папика. Стремитесь, учитесь, язык английский к примеру, в качалку сходите. Работы много, не успеете менять. Зарплаты какие. Конечно каждого нудика туда не берут. API Google, Facebook, VK, OK, Instagram освоите - это только один из 10 нужных пунктиков. Удачи.
омг это дно ещё и индекс массива с ключами путает
сынок, я каждую неделю узнаю больше, чем ты за год.
Код: sql
1.
2.
$a = ['key1' => [5 => ['key2' => true]]];
echo $a[key1][5][key2];


автор# ./t.php

PHP Warning: Use of undefined constant key1 - assumed 'key1' (this will throw an Error in a future version of PHP) in t.php on line 6
PHP Warning: Use of undefined constant key2 - assumed 'key2' (this will throw an Error in a future version of PHP) in t.php on line 6

# php -v
PHP 7.2.8-1+0~20180725124257.2+stretch~1.gbp571e56 (cli) (built: Jul 25 2018 12:43:00) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.8-1+0~20180725124257.2+stretch~1.gbp571e56, Copyright (c) 1999-2018, by Zend Technologies
у тебя язык впереди головы, овощ.
и ещё раз 20 внимательно посмотри, как именно там у тебя ячейка вызывается, и как у меня.
...
Рейтинг: 0 / 0
07.09.2018, 16:06
    #39699751
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Видимость внутри функции переменных
Спасибо. Все сложилось.
Когда функция в функции, то нужно дважды объявить. Во внешней функции и во внутренней. Иначе никак. Если переменная была передана первой функции как параметр, то можно даже после require_one в самом PHP написать первый global, а второй тот же global внутри вложенной функции и заработает. Если придуманная переменная используется внутри родительской функции, тогда прямо в родительской функции до require_one нужно объявить global и в require_one >> функции также объявить - будет работать.

Как-то так :)
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Видимость внутри функции переменных / 25 сообщений из 50, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]