Хм... :-\
<?php
# if the service has it's own custom extern declaration, use that instead
$clause = $entry['extern'];
if (isset($clause)) {
...
?>
<?php
...
'edutopia' => array(
'extern' =>
'<object width="$3" height="$4">' .
...
'youtube' => array(
'url' => 'http://www.youtube.com/v/$1'
),
'youtubehd' => array(
'url' => '[url=http://www.youtube.com/v/$1&ap=%2526fmt%3D22']http://www.youtube.com/v/$1&ap=%26fmt=22'[/url];,
'default_width' => 720,
'default_ratio' => 16/9
)
);
?>
Надо думать, кодер неправильно проверяет существование элемента в массиве, и в строгом режиме PHP выдаёт предупреждение. Можно пропатчить, если пыхпыхеры скажут кошерное решение. Я сам в PHP не разбираюсь.
Попробуйте заменить
$clause = $entry['extern'];
if (isset($clause)) {
на
if (isset($entry['extern'])) {
$clause = $entry['extern'];
Если и после этого будут ошибки, тогда добавить ещё одну строчку:
$clause = 0;
if (isset($entry['extern'])) {
$clause = $entry['extern'];
Цитата: myst от августа 30, 2010, 14:48
'url' => 'http://www.youtube.com/v/$1&ap=%26fmt=22' (http://www.youtube.com/v/$1&ap=%2526fmt%3D22');,
Вы уверены, что точка с запятой там к месту?
Как это поможет, если
Цитата: http://www.php.net/manual/en/language.types.array.php
Note:
Attempting to access an array key which has not been defined is the same as accessing any other undefined variable: an E_NOTICE-level error message will be issued, and the result will be NULL.
, а обращение по несуществующему индексу никуда не делось?
Цитата: jvarg от августа 31, 2010, 08:09
Цитата: myst от августа 30, 2010, 14:48
'url' => 'http://www.youtube.com/v/$1&ap=%26fmt=22' (http://www.youtube.com/v/$1&ap=%2526fmt%3D22');,
Вы уверены, что точка с запятой там к месту?
Это вообще не имеет отношения к делу. Я привёл этот фрагмент, чтобы показать, что для YouTube действительно нет индекса
extern.
Цитата: http://www.php.net/manual/en/function.isset.php
This also work for elements in arrays:
<?php
$a = array ('test' => 1, 'hello' => NULL);
var_dump(isset($a['test'])); // TRUE
var_dump(isset($a['foo'])); // FALSE
var_dump(isset($a['hello'])); // FALSE
// The key 'hello' equals NULL so is considered unset
// If you want to check for NULL key values then try:
var_dump(array_key_exists('hello', $a)); // TRUE
?>
Капец! Убить создателя этого быдлоязыка! Убить, убить!
Значит таки поможет...
Цитата: jvarg от августа 31, 2010, 08:09
Цитата: myst от августа 30, 2010, 14:48
'url' => 'http://www.youtube.com/v/$1&ap=%26fmt=22' (http://www.youtube.com/v/$1&ap=%2526fmt%3D22');,
Вы уверены, что точка с запятой там к месту?
В объявлении массива?! Окститесь! Там только запятые возможны.
Цитата: myst от августа 31, 2010, 08:18
Как это поможет, если <...> обращение по несуществующему индексу никуда не делось?
Делось же. :eat:
Цитата: myst от августа 31, 2010, 08:28
Цитата: http://www.php.net/manual/en/function.isset.php
This also work for elements in arrays:
<?php
$a = array ('test' => 1, 'hello' => NULL);
var_dump(isset($a['test'])); // TRUE
var_dump(isset($a['foo'])); // FALSE
var_dump(isset($a['hello'])); // FALSE
// The key 'hello' equals NULL so is considered unset
// If you want to check for NULL key values then try:
var_dump(array_key_exists('hello', $a)); // TRUE
?>
Капец! Убить создателя этого быдлоязыка! Убить, убить!
Значит таки поможет...
Вообще-то в некоторой мере такая конструкция не менее логична. :eat:
Пора бы знать, что в PHP библиотека и язык срослись.
Цитата: myst от августа 31, 2010, 08:21
Это вообще не имеет отношения к делу. Я привёл этот фрагмент, чтобы показать, что для YouTube действительно нет индекса extern.
Вы могли бы его сами добавить. Это авор таким образом реализовал возможность дополнительной конфигурации. :eat:
Цитата: Demetrius от августа 31, 2010, 09:32
Вообще-то в некоторой мере такая конструкция не менее логична. :eat:
Ога, синтаксис тот же — порядок операций другой. Классная логика! Глобально и надёжно. :green:
Цитата: Demetrius от августа 31, 2010, 09:32
Пора бы знать, что в PHP библиотека и язык срослись.
Это как-то оправдывает аффтаров, родивших чудовище? :eat:
Цитата: Demetrius от августа 31, 2010, 09:32
Вы могли бы его сами добавить. Это авор таким образом реализовал возможность дополнительной конфигурации. :eat:
С какого перепуга я должен что-то добавлять сам? Автор не добавил, значит не надо. А вот как пыхеры пишут, что у них в одном месте работает, а в другом предупреждения сыпятся при том, что язык тот же, интерпретатор тоже — это очень интересный вопрос.
Цитата: myst от августа 31, 2010, 10:21
Цитата: Demetrius от августа 31, 2010, 09:32
Вообще-то в некоторой мере такая конструкция не менее логична. :eat:
Ога, синтаксис тот же — порядок операций другой. Классная логика! Глобально и надёжно. :green:
Порядок действий тот же. Ошибка выдаётся не при получении элемента из массива, а при попытке его использовать в операторе.
Цитата: myst от августа 31, 2010, 10:21
Цитата: Demetrius от августа 31, 2010, 09:32
Пора бы знать, что в PHP библиотека и язык срослись.
Это как-то оправдывает аффтаров, родивших чудовище? :eat:
«Евреи сделали много плохих вещей» ©
Phersu ;)
Цитата: myst от августа 31, 2010, 10:21
Цитата: Demetrius от августа 31, 2010, 09:32
Вы могли бы его сами добавить. Это авор таким образом реализовал возможность дополнительной конфигурации. :eat:
С какого перепуга я должен что-то добавлять сам? Автор не добавил, значит не надо. А вот как пыхеры пишут, что у них в одном месте работает, в другом предупреждения сыпятся; при том язык тот же интерпретатор тоже — это очень интересный вопрос.
Вы ещё волшебнокавычки и автоматический перенос переданных извне переменных в глобальную область видимости включите, у Вас ещё больше скриптов попадает. :green:
Всё зависит от автора. Что поделать, в PHP много любителей. Я уверен, что если бы Common Lisp стал да-факто стандартом для программирования в интернете, на нём бы такой мути было не меньше.
Вообще, я вижу это так: PHP был DSL, хоть Вы и не согласны со мной в этом, но DSL, заточенный под определённую цель: обработка полученных из HTML-страницы форм и вывод результатов в виде HTML на мелких домашних страницах. Отсюда встраиваемость прямо в код страницы (которая уже не нужна), отсюда отсутствие модулей как таковых, отсюда волшебнокавычки и расшифровка переданных переменных.
Когда его стали использовать повсеместно и для серьёзных проектов, авторы ужаснулись и стали приводить его в божеский вид. Но — ведь резкие изменения могут не принять — постепенно. Отсюда столько режимов интерпретатора (кстати, их можно переключать прямо в скрипте, и любая функция может спрятать ошибки других ;)).
Цитата: Demetrius от августа 31, 2010, 10:36
Порядок действий тот же. Ошибка выдаётся не при получении элемента из массива, а при попытке его использовать в операторе.
Тогда какого хрена от
<?php
$entry['extern'];
?>
то же предупреждение вылезает, а?
Это предупреждение операции индексации, и если isset($entry['extern']) не выдаёт предупреждение, значит индексация не выполняется перед isset.
Цитата: Demetrius от августа 31, 2010, 09:32ЦитироватьЦитировать
Цитата: jvarg от Сегодня в 12:09Цитата: myst от Вчера в 18:48'url' => 'http://www.youtube.com/v/$1&ap=&fmt=22' (http://www.youtube.com/v/$1&ap=%26fmt=22');;,
Вы уверены, что точка с запятой там к месту?
В объявлении массива?! Окститесь! Там только запятые возможны.
Так и я про то же. Но в отрывке-то есть.
Цитата: Demetrius от августа 31, 2010, 10:36
Вообще, я вижу это так: PHP был DSL, хоть Вы и не согласны со мной в этом, но DSL, заточенный под определённую цель: обработка полученных из HTML-страницы форм и вывод результатов в виде HTML на мелких домашних страницах. Отсюда встраиваемость прямо в код страницы (которая уже не нужна), отсюда отсутствие модулей как таковых, отсюда волшебнокавычки и расшифровка переданных переменных.
Когда его стали использовать повсеместно и для серьёзных проектов, авторы ужаснулись и стали приводить его в божеский вид. Но — ведь резкие изменения могут не принять — постепенно. Отсюда столько режимов интерпретатора (кстати, их можно переключать прямо в скрипте, и любая функция может спрятать ошибки других ;)).
Наколеночный выродок, о чём я и говорю.
Цитата: jvarg от августа 31, 2010, 10:51
Так и я про то же. Но в отрывке-то есть.
Ещё раз по буквам: э т о н е и м е е т о т н о ш е н и я к д е л у.
Нормальный язык для своих целей. Что вы до него докапались.
Цитата: jvarg от августа 31, 2010, 10:59
Нормальный язык для своих целей. Что вы до него докапались.
Основная проблема в том, что в наше время его используют явно не для своих целей.
Если бы он был нормальным, я бы не докапывался. Для каких целей он создавался, какие элементы грамматики этого языка оптимизированы под эти цели?
Добавление небольшой интерактивности на уже работающий веб-сайт. Типа, гостевые книжечки всякие, счётчики посущений, голосования.
Я уже говорил:
- встраивание в код <? ... ?>
- обращение к переданных из интернета переменным как к основным (к счастью, уже убрали)
- автоматические экранирование спецсимволов (к счастью, уже убрали)
Негусто для специального языка. :green:
Цитата: Demetrius от августа 31, 2010, 11:13
обращение к переданных из интернета переменным как к основным (к счастью, уже убрали)
Это вообще не относится к языку.
Цитата: myst от августа 31, 2010, 11:04
Если бы он был нормальным, я бы не докапывался. Для
Странный у вас критерий нормальности. Т.е., все, что не нравится лично вам - ненормально?
Цитата: jvarg от августа 31, 2010, 11:25
Странный у вас критерий нормальности. Т.е., все, что не нравится лично вам - ненормально?
Когда один и тот же синтаксис имеет разную семантику, это нормально?
Я так и не понял, что конкретно вызвало ваше возмущение?
Цитата: myst от августа 31, 2010, 11:48
Когда один и тот же синтаксис имеет разную семантику, это нормально?
Конечно. Это омонимия. Языки без омонимии ненормальны. :eat:
Логично, что
$x и
$z[1] обрабатываются одинаково? Логично.
Цитата: myst от августа 31, 2010, 08:28
Цитата: http://www.php.net/manual/en/function.isset.php
This also work for elements in arrays:
<?php
$a = array ('test' => 1, 'hello' => NULL);
var_dump(isset($a['test'])); // TRUE
var_dump(isset($a['foo'])); // FALSE
var_dump(isset($a['hello'])); // FALSE
// The key 'hello' equals NULL so is considered unset
// If you want to check for NULL key values then try:
var_dump(array_key_exists('hello', $a)); // TRUE
?>
Капец! Убить создателя этого быдлоязыка! Убить, убить!
Значит таки поможет...
Здесь я ваших воплей вообще не понял.
Фукция isset() проверяет, была ли инициализированна переменная. Присваивание NULL не является инициализацией, так как это и есть значение перменной в момент создания.
А функция array_key_exists() проверяет, существует ли ключ с таким наименованием вообще (не важно, был ли он инициализирован, или нет).
Цитата: jvarg от августа 31, 2010, 12:41
Здесь я ваших воплей вообще не понял.
Фукция isset() проверяет, была ли инициализированна переменная. Присваивание NULL не является инициализацией, так как это и есть значение перменной в момент создания.
Идея в том, что аргументы функции вычисляются до её выполнения. То есть при вызове функции
a(10+3) ей будет передано число 13, а не 10+3.
Если бы
isset была функцией, то сначала должно бы по идее вычислиться значение
$arr['sth'], при этом вычислении должна была бы произойти ошибка, и, следовательно,
isset($arr['sth']) должно бы всегда вызывать ошибку.
Но, так как myst не дочитал до конца:
Цитата: http://www.php.net/manual/en/function.isset.php
Note: Because this is a language construct and not a function, it cannot be called using variable functions
Ему кажется, что здесь есть что-то нелогичное.
Цитата: Demetrius от августа 31, 2010, 12:27
Конечно. Это омонимия. Языки без омонимии ненормальны. :eat:
За языки программирования с омонимией сжигать надо живьём.
Цитата: Demetrius от августа 31, 2010, 12:27
Логично, что $x и $z[1] обрабатываются одинаково? Логично.
Логично, что foo(a
) ≡ λ = a, foo(λ); а bar(a) ≢ λ = a, bar(λ)?
Цитата: Demetrius от августа 31, 2010, 12:54
Но, так как myst не дочитал до конца:
Quote from: http://www.php.net/manual/en/function.isset.phpЦитироватьNote: Because this is a language construct and not a function, it cannot be called using variable functions
Ему кажется, что здесь есть что-то нелогичное.
Каким образом документирование алогичности отменяет алогичность?
Цитата: jvarg от августа 31, 2010, 12:41
Здесь я ваших воплей вообще не понял.
Try again.
Цитата: jvarg от августа 31, 2010, 12:41
Фукция isset() проверяет, была ли инициализированна переменная. Присваивание NULL не является инициализацией, так как это и есть значение перменной в момент создания.
А функция array_key_exists() проверяет, существует ли ключ с таким наименованием вообще (не важно, был ли он инициализирован, или нет).
Капитан Очевидность попросил подменить?
Цитата: myst от августа 31, 2010, 13:17
Цитата: Demetrius от августа 31, 2010, 12:27
Конечно. Это омонимия. Языки без омонимии ненормальны. :eat:
За языки программирования с омонимией сжигать надо живьём.
var array = [1, 2, 3]
alert(array[3])Омонимичное использование квадратных скобок в JavaScript'е.
a = 10 & b;
c = &d;Омонимичное использование амперсанда в C++.
a = *c;
b = d * f;Омонимичное использование звёздочки в C.
var
A: ↑Integer;
begin
new(A);
A↑ := 1;Омонимичное использование стрелочки в Паскале.
Ой, боюсь я, только авторы APL'а избегут карающей длани.
Цитата: myst от августа 31, 2010, 13:17
Цитата: Demetrius от августа 31, 2010, 12:27
Логично, что $x и $z[1] обрабатываются одинаково? Логично.
Логично, что foo(a) ≡ λ = a, foo(λ); а bar(a) ≢ λ = a, bar(λ)?
А там как раз foo(a
) ≡ λ = a, foo(λ); и bar(a) ≡ λ = a, bar(λ).
Воспринимается, что функции принимают не значения, а выражения. Время вычисления этих выражений не важно. То, что на самом деле человеческая логика не совпадает с логикой императивных ЯП, не столь важно.
Наоборот, нелогично было бы, если бы семантика isset требовала бы строк в кавычках: везде переменные называются без кавычек, а здесь с кавычками.
Цитата: myst от августа 31, 2010, 13:17
Цитата: Demetrius от августа 31, 2010, 12:54
Но, так как myst не дочитал до конца:
Quote from: http://www.php.net/manual/en/function.isset.phpЦитироватьNote: Because this is a language construct and not a function, it cannot be called using variable functions
Ему кажется, что здесь есть что-то нелогичное.
Каким образом документирование алогичности отменяет алогичность?
А то, что ключевые слова и индентификаторы обозначаются одинаково — тоже по Вашему алогичность?
Цитата: Demetrius от августа 31, 2010, 13:49
var array = [1, 2, 3]
alert(array[3])
Омонимичное использование квадратных скобок в JavaScript'е.
Разный контекст.
Цитата: Demetrius от августа 31, 2010, 13:49
a = 10 & b;
c = &d;
Омонимичное использование амперсанда в C++.
Унарность vs бинарность.
[/quote]
Цитата: Demetrius от августа 31, 2010, 13:49
a = *c;
b = d * f;
Омонимичное использование звёздочки в C.
То же самое.
Цитата: Demetrius от августа 31, 2010, 13:49
var
A: ↑Integer;
begin
new(A);
A↑ := 1;
Омонимичное использование стрелочки в Паскале.
Разный контекст.
Цитата: Demetrius от августа 31, 2010, 13:49
А там как раз foo(a) ≡ λ = a, foo(λ); и bar(a) ≡ λ = a, bar(λ).
То есть Вы утверждаете, что вычисление параметра подпрограммы в PHP выполняется не перед её вызовом?
Цитата: Demetrius от августа 31, 2010, 13:49
Воспринимается, что функции принимают не значения, а выражения. Время вычисления этих выражений не важно.
Кем воспринимается? Функции парсят выражения, передаваемые в параметрах, а потом их выполняют? При чём тут время вычисления? Кому оно неважно? Какой-то поток сознания, однако.
Цитата: Demetrius от августа 31, 2010, 13:49
Наоборот, нелогично было бы, если бы семантика isset требовала бы строк в кавычках: везде переменные называются без кавычек, а здесь с кавычками.
Какого чёрта огурец выглядит как помидор?
Цитата: Demetrius от августа 31, 2010, 13:49
А то, что ключевые слова и индентификаторы обозначаются одинаково — тоже по Вашему алогичность?
Ключевые слова перечислены в грамматике. Реквестирую грамматику PHP на анализ.
myst, а вы функций, принимающих ссылки, не видели? Они же примерно так же работают, как этот isset. Или скажете, что можно обойтись без них? (Ну да, можно, можно и без побочного эффекта обойтись, можно вообще на Unlambda писать.)
Если б это было на C++ и если бы в нём частично не было строгой типизации, можно было бы увидеть такие прототипы:
bool isset(&v);
bool somefunc(v);
Цитата: arseniiv от августа 31, 2010, 14:28
myst, а вы функций, принимающих ссылки, не видели? Они же примерно так же работают, как этот isset. Или скажете, что можно обойтись без них?
Как Вы себе представляете взятие ссылки несуществующего объекта и последствия оного?
Цитата: arseniiv от августа 31, 2010, 14:28
Если б это было на C++ и если бы в нём частично не было строгой типизации, можно было бы увидеть такие прототипы:
bool isset(&v);
bool somefunc(v);
Пример вообще не в тему.
Цитата: Demetrius от августа 31, 2010, 13:49
Наоборот, нелогично было бы, если бы семантика isset требовала бы строк в кавычках: везде переменные называются без кавычек, а здесь с кавычками.
Блин, только сейчас понял. Должен быть предикат существования индекса, а такое порно не нужно.
Цитата: myst от августа 31, 2010, 14:38
Как Вы себе представляете взятие ссылки несуществующего объекта и последствия оного?
Как особенный ссылочный nil/NULL/empty/unassigned/что-там-ещё-бывает. Вообще, надо, чтобы все несуществующие вещи имели вид как существующие до инициализации. Тогда там никакая функция не нужна и проверять на равенство nil. Очень хорошая, по мне, идея.
Цитата: myst от августа 31, 2010, 14:10
Цитата: Demetrius от августа 31, 2010, 13:49
А там как раз foo(a) ≡ λ = a, foo(λ); и bar(a) ≡ λ = a, bar(λ).
То есть Вы утверждаете, что вычисление параметра подпрограммы в PHP выполняется не перед её вызовом?
Я утверждаю, что
isset не подпрограмма. И то, что она не подпрограмма, совершенно логично.
Цитата: myst от августа 31, 2010, 14:10
Цитата: Demetrius от августа 31, 2010, 13:49
Воспринимается, что функции принимают не значения, а выражения. Время вычисления этих выражений не важно.
Кем воспринимается? Функции парсят выражения, передаваемые в параметрах, а потом их выполняют? При чём тут время вычисления? Кому оно неважно? Какой-то поток сознания, однако.
:wall:
Я имею ввиду восприятие человеком.
Цитата: myst от августа 31, 2010, 14:10
Цитата: Demetrius от августа 31, 2010, 13:49
Наоборот, нелогично было бы, если бы семантика isset требовала бы строк в кавычках: везде переменные называются без кавычек, а здесь с кавычками.
Какого чёрта огурец выглядит как помидор?
Огурец выглядит как огурец. Только огурцы бывают разные: больше, меньше, зеленее, темнее. То, что вы привыкли к тому, что все огурцы одинаковы, вовсе не значит, что так должно быть.
Цитата: myst от августа 31, 2010, 14:10
Цитата: Demetrius от августа 31, 2010, 13:49
А то, что ключевые слова и индентификаторы обозначаются одинаково — тоже по Вашему алогичность?
Ключевые слова перечислены в грамматике. Реквестирую грамматику PHP на анализ.
Про грамматику не в курсе, а ключевые слова перечислены тут: http://php.net/manual/en/reserved.keywords.php (http://php.net/manual/en/reserved.keywords.php).
isset там есть, кстати.
Цитата: myst от августа 31, 2010, 14:47
Блин, только сейчас понял. Должен быть предикат существования индекса, а такое порно не нужно.
Это же жутко неудобно. Тогда надо было бы делать
if (isset($array) && 'sth' in $array), а в PHP достаточно
if (isset($array['sth'])). Вы же не будете утверждать, что первое удобнее и понятнее? :eat:
Цитата: Demetrius от августа 31, 2010, 15:10
Я утверждаю, что isset не подпрограмма. И то, что она не подпрограмма, совершенно логично.
А чего она тогда выглядит как подпрограмма, ы?
Цитата: Demetrius от августа 31, 2010, 15:10
Огурец выглядит как огурец. Только огурцы бывают разные: больше, меньше, зеленее, темнее. То, что вы привыкли к тому, что все огурцы одинаковы, вовсе не значит, что так должно быть.
Какой же это огурец (подпрограмма), если это никакой не огурец?
Цитата: Demetrius от августа 31, 2010, 15:10
Про грамматику не в курсе,
Так у этого поделия и грамматики нет?
Цитата: Demetrius от августа 31, 2010, 15:10
а ключевые слова перечислены тут: http://php.net/manual/en/reserved.keywords.php. isset там есть, кстати.
Как-то там не очень ясно. Но чем бы оно ни было, что оно делает в списке функций (http://www.php.net/manual/en/ref.var.php), если это не подпрограмма?
Цитата: Demetrius от августа 31, 2010, 15:10
Это же жутко неудобно. Тогда надо было бы делать if (isset($array) && 'sth' in $array), а в PHP достаточно if (isset($array['sth'])). Вы же не будете утверждать, что первое удобнее и понятнее? :eat:
Ога, создать предикат has_index($array, 'index'), возвращающий false, когда array == NULL или 'index' не существует, низя. :eat:
Цитата: arseniiv от августа 31, 2010, 14:52
Цитата: myst от августа 31, 2010, 14:38
Как Вы себе представляете взятие ссылки несуществующего объекта и последствия оного?
Как особенный ссылочный nil/NULL/empty/unassigned/что-там-ещё-бывает. Вообще, надо, чтобы все несуществующие вещи имели вид как существующие до инициализации. Тогда там никакая функция не нужна и проверять на равенство nil. Очень хорошая, по мне, идея.
arseniiv, Вы как обычно на какой-то своей волне.
Ну так и быть, приведите мне на языке C++ код взятия ссылки несуществующего объекта и результат работы такой программы.
Цитата: myst от августа 31, 2010, 15:46
Цитата: Demetrius от августа 31, 2010, 15:10
Я утверждаю, что isset не подпрограмма. И то, что она не подпрограмма, совершенно логично.
А чего она тогда выглядит как подпрограмма, ы?
Потому что так удобно.
sizeof в
typeof тоже обычно делают похожими на подпрограммы.
Цитата: myst от августа 31, 2010, 15:46
Цитата: Demetrius от августа 31, 2010, 15:10
Огурец выглядит как огурец. Только огурцы бывают разные: больше, меньше, зеленее, темнее. То, что вы привыкли к тому, что все огурцы одинаковы, вовсе не значит, что так должно быть.
Какой же это огурец (подпрограмма), если это никакой не огурец?
А с чего вы взяли, что всё, после чего стоит скобка, это функция?
Цитата: myst от августа 31, 2010, 15:46
Цитата: Demetrius от августа 31, 2010, 15:10
Про грамматику не в курсе,
Так у этого поделия и грамматики нет?
Как может быть язык без грамматики?
Цитата: myst от августа 31, 2010, 15:46
Цитата: Demetrius от августа 31, 2010, 15:10
а ключевые слова перечислены тут: http://php.net/manual/en/reserved.keywords.php. isset там есть, кстати.
Как-то там не очень ясно. Но чем бы оно ни было, что оно делает в списке функций (http://www.php.net/manual/en/ref.var.php), если это не подпрограмма?
Оно облегчает себяпоиск при обращении к документации. :eat:
Там ещё и delete (http://www.php.net/manual/en/function.delete.php) есть.
Цитата: myst от августа 31, 2010, 15:46
Ну так и быть, приведите мне на языке C++ код взятия ссылки несуществующего объекта и результат работы такой программы.
Языкъ C++ — мѣра всѣхъ вещей?
myst, неужели вы не видите, что в скобках
preg_replace('/(\S+@\S+\.\S+)/', '<a href="mailto:$1>$1</a>', $str) и в
isset($str) разный контекст за счёт семантики самого
isset?
PHP - forever!!!
Myst must be disassembled!!!!
Цитата: myst от августа 31, 2010, 15:49
Ну так и быть, приведите мне на языке C++ код взятия ссылки несуществующего объекта и результат работы такой программы.
Я не говорил, что то C++. Такому коду мешает спецификация языка, в частности, строгое указание типа. А вот если бы все переменные в этом языке были бы указателями, то код был бы такой (рабочий):
bool isset(void *var) {
return var != NULL;
}P. S. Истинно говорю вам: что мешает рассматривать isset как функцию, берущую аргумент-ссылку? (Пока справку по PHP не открывал и не знаю, можно ли такое сделать с своими функциями.)
Цитата: Demetrius от августа 31, 2010, 17:00
Потому что так удобно.
О-о, расскажите об этом подробнее.
Цитата: Demetrius от августа 31, 2010, 17:00
sizeof в typeof тоже обычно делают похожими на подпрограммы.
Ви так оворите, будто это что-то хорошее. :eat:
Цитата: Demetrius от августа 31, 2010, 17:00
А с чего вы взяли, что всё, после чего стоит скобка, это функция?
Так всё-таки не огурец? :green:
Цитата: Demetrius от августа 31, 2010, 17:00
Как может быть язык без грамматики?
Где же она? Покажите.
Цитата: Demetrius от августа 31, 2010, 17:00
Языкъ C++ — мѣра всѣхъ вещей?
Это arseniiv его приплёл, я-то тут при чём? :donno:
Цитата: Demetrius от августа 31, 2010, 17:00
myst, неужели вы не видите, что в скобках preg_replace('/(\S+@\S+\.\S+)/', '<a href="mailto:$1>$1</a>', $str) и в isset($str) разный контекст за счёт семантики самого isset?
Я-то думал, что контекст — это нечто внешнее, а это вот оно как...
int i, j=10; i = foo(5); i = bar("string"); i = zoo(j) — разные вещи в скобках, стало быть контексты разные. :smoke:
Цитата: arseniiv от августа 31, 2010, 17:18
Цитата: myst от августа 31, 2010, 15:49
Ну так и быть, приведите мне на языке C++ код взятия ссылки несуществующего объекта и результат работы такой программы.
Я не говорил, что то C++. Такому коду мешает спецификация языка, в частности, строгое указание типа. А вот если бы все переменные в этом языке были бы указателями, то код был бы такой (рабочий):
bool isset(void *var) {
return var != NULL;
}
P. S. Истинно говорю вам: что мешает рассматривать isset как функцию, берущую аргумент-ссылку? (Пока справку по PHP не открывал и не знаю, можно ли такое сделать с своими функциями.)
Туго-то как... Возьмите же ссылку на элемент массива, не выполняя индексации, а я посмотрю.
Цитата: myst от августа 31, 2010, 17:23
Туго-то как... Возьмите же ссылку на элемент массива, не выполняя индексации, а я посмотрю.
К сожалению, я не знаю ни одного языка, где это можно. Но я могу придумать свой! Вы чего хотите-то? Например, в Lua можно обратиться к несуществующему элементу таблицы и получить nil. Увы, там нет ссылок как отдельной сущности.
Цитата: arseniiv от августа 31, 2010, 17:26
К сожалению, я не знаю ни одного языка, где это можно.
Это ответ на вопрос
Цитата: arseniiv от августа 31, 2010, 17:18
что мешает рассматривать isset как функцию, берущую аргумент-ссылку?
Цитата: arseniiv от августа 31, 2010, 17:26
Вы чего хотите-то?
Я хочу, чтобы Вы наконец вникли в обсуждаемый вопрос и перестали гнать ахинею.
Ладно, перестану. Потому что сам сейчас не могу разобраться, где я написал нелепо, а где без не. (Но мне казалось, что я чуть-чуть к месту, конечно.) Буду наблюдать.
Цитата: myst от августа 31, 2010, 17:20
Цитата: Demetrius от августа 31, 2010, 17:00
Потому что так удобно.
О-о, расскажите об этом подробнее.
Сравните:
return isset($a['b']['c']->d)return in_array($a, 'b') ? (in_array($a['b'], 'c') ? has_property($a['b']['c']->d) : false) : false;Что удобнее, ваш волшебный предикат или
isset? :green:
Правда, если бы не было isset и был только Ваш предикат, можно было бы делать всё с try... except и вообще не пользоваться этим Вашим предикатом. Но — вариант PHP тоже удобен.
Цитата: myst от августа 31, 2010, 17:20
Цитата: Demetrius от августа 31, 2010, 17:00
sizeof в typeof тоже обычно делают похожими на подпрограммы.
Ви так оворите, будто это что-то хорошее. :eat:
А что в этом плохого? Тогда давайте сделаем идентификаторы и ключеслова тоже отдельными.
Цитата: myst от августа 31, 2010, 17:20
Цитата: Demetrius от августа 31, 2010, 17:00
А с чего вы взяли, что всё, после чего стоит скобка, это функция?
Так всё-таки не огурец? :green:
Давайте сначала определимся, что есть огурец и помидор в данном контексте.
Цитата: myst от августа 31, 2010, 17:20
Цитата: Demetrius от августа 31, 2010, 17:00
Как может быть язык без грамматики?
Где же она? Покажите.
Читайте справку. :eat: То, что она не описана в БНФ, не значит, что её нет. Я вообще не понимаю, в чём такая польза от БНФ.
Поищите на сайте PHP Compiler'а, вроде бы у них была формально описанная.
Цитата: myst от августа 31, 2010, 17:20
Цитата: Demetrius от августа 31, 2010, 17:00
myst, неужели вы не видите, что в скобках preg_replace('/(\S+@\S+\.\S+)/', '<a href="mailto:$1>$1</a>', $str) и в isset($str) разный контекст за счёт семантики самого isset?
Я-то думал, что контекст — это нечто внешнее, а это вот оно как...
int i, j=10; i = foo(5); i = bar("string"); i = zoo(j) — разные вещи в скобках, стало быть контексты разные. :smoke:
Да. Скорее всего, foo и bar — функции с разными аргументами. Без объявления не скажешь точно, с какими.
Цитата: jvarg от августа 31, 2010, 17:03
PHP - forever!!!
Не дай бог. :uzhos:
Цитата: jvarg от августа 31, 2010, 17:03
Myst must be disassembled!!!!
Myst робот?
Цитата: Demetrius от сентября 1, 2010, 09:50
в чём такая польза от БНФ
А она не помогает строить трансляторы? Каждой продукции в нерасширенной БНФ соответствует процедура, и так они вместе весь текст разбирают по кусочкам от lexer'а. Можно иначе (не знаю)? (Для простых языков вроде форта, лиспа — конечно, но ведь их синтаксис простой.)
Цитата: arseniiv от сентября 1, 2010, 10:43
А она не помогает строить трансляторы?
Наверное, помогает, не знаю. :donno: Никогда этим не занимался.
Я-то для своего страшного BFormat'а делал... ;D
Цитата: Demetrius от сентября 1, 2010, 09:50
Цитата: jvarg от Myst must be disassembled!!!!
Myst робот?
Ну, "Myst must die" я посчитал несколько грубоватым...
Цитата: Demetrius от сентября 1, 2010, 09:50
Сравните:
return isset($a['b']['c']->d)
return in_array($a, 'b') ? (in_array($a['b'], 'c') ? has_property($a['b']['c']->d) : false) : false;
Что удобнее, ваш волшебный предикат или isset? :green:
Ладно, убедили. Только второй вариант явно намеренно сделан более громоздким, чем требуется. :negozhe: Зачем здесь тернарные операторы? Можно же
return in_array($a, 'b') && in_array($a['b'], 'c') && has_property($a['b']['c']->d);
Цитата: Demetrius от сентября 1, 2010, 09:50
Давайте сначала определимся, что есть огурец и помидор в данном контексте.
Так уже определились сто лет как. (См. выше.)
Цитата: Demetrius от сентября 1, 2010, 09:50
А что в этом плохого? Тогда давайте сделаем идентификаторы и ключеслова тоже отдельными.
Смешение ж и п. Правильно сделано в Аде.
Цитата: Demetrius от сентября 1, 2010, 09:50
Читайте справку. :eat:
Я уже почитал. В одном месте isset — function, в другом — language construct. Спасибо.
Цитата: Demetrius от сентября 1, 2010, 09:50
То, что она не описана в БНФ, не значит, что её нет.
Покажите в другом виде, я не гордый. :eat:
Цитата: Demetrius от сентября 1, 2010, 09:50
Поищите на сайте PHP Compiler'а, вроде бы у них была формально описанная.
А, то есть я искать должен?
Цитата: Demetrius от сентября 1, 2010, 09:50
Да. Скорее всего, foo и bar — функции с разными аргументами. Без объявления не скажешь точно, с какими.
И чего, что разные параметры? Одна из них перестаёт от этого быть подпрограммой?
Цитата: myst от сентября 1, 2010, 10:56
Цитата: Demetrius от сентября 1, 2010, 09:50
Сравните:
return isset($a['b']['c']->d)
return in_array($a, 'b') ? (in_array($a['b'], 'c') ? has_property($a['b']['c']->d) : false) : false;
Что удобнее, ваш волшебный предикат или isset? :green:
Ладно, убедили. Только второй вариант явно намеренно сделан более громоздким, чем требуется. :negozhe: Зачем здесь тернарные операторы? Можно же
return in_array($a, 'b') && in_array($a['b'], 'c') && has_property($a['b']['c']->d);
Я просто о таком варианте не подумал. :)
Цитата: myst от сентября 1, 2010, 10:56
Цитата: Demetrius от сентября 1, 2010, 09:50
А что в этом плохого? Тогда давайте сделаем идентификаторы и ключеслова тоже отдельными.
Смешение ж и п. Правильно сделано в Аде.
:o
В аде сантиметры в дециметры неявно не переведёшь.
Возможно, это и удобно, но... как-то громоздко.
Цитата: myst от сентября 1, 2010, 10:56Я уже почитал. В одном месте isset — function, в другом — language construct. Спасибо.
Function reference перечисляет функции и языковые конструкции, похожие на функции.
Цитата: myst от сентября 1, 2010, 10:56Цитата: Demetrius от сентября 1, 2010, 09:50
То, что она не описана в БНФ, не значит, что её нет.
Покажите в другом виде, я не гордый. :eat:
Э... А вся справка — это что?
Цитата: myst от сентября 1, 2010, 10:56Цитата: Demetrius от сентября 1, 2010, 09:50
Поищите на сайте PHP Compiler'а, вроде бы у них была формально описанная.
А, то есть я искать должен?
Ну Вам же надо, не мне. :о
Цитата: myst от сентября 1, 2010, 10:56Цитата: Demetrius от сентября 1, 2010, 09:50
Да. Скорее всего, foo и bar — функции с разными аргументами. Без объявления не скажешь точно, с какими.
И чего, что разные параметры? Одна из них перестаёт от этого быть подпрограммой?
Возможно, и перестаёт. Зависит от языка.
Float(10) в паскале — тоже подпрограмма?
Вообще, я не считаю, что PHP — хорошо спроектированный язык. Но при этом это не такой уж и монстр. İ℧ SQL гораздо страшнее.
Ту же
isset удобнее заменить исключениями, но, т.к. они в PHP появились недавно, никто ещё их не использует. Да и ещё мешает то, что в текущей версии это только Hint, что сделано для совместимости.
Но —
а) PHP позволяет писать работающие программы достаточно высокой сложности (та же MediaWiki), если он handled with care,
б) PHP установлен почти на всех хостингах. С этим приходится мириться.
Цитата: Demetrius от сентября 1, 2010, 11:19
Возможно, и перестаёт. Зависит от языка.
Float(10) в паскале — тоже подпрограмма.
Там нету такого типа. :) Да и не позиционируют как функцию. А вот
Exit,
Break,
Continue — ещё как процедуры.
Цитата: Demetrius от сентября 1, 2010, 11:19
В аде сантиметры в дециметры неявно не переведёшь.
Я про sizeof говорил, но и это сделано тоже правильно.
Цитата: Demetrius от сентября 1, 2010, 11:19
Возможно, это и удобно, но... как-то громоздко.
Программы предназначены в первую очередь чтения людьми. Проблема ленивых кодеров решается кнутом и пряником, на худой конец — IDE.
Цитата: Demetrius от сентября 1, 2010, 11:19
Function reference перечисляет функции и языковые конструкции, похожие на функции.
Открыл http://www.php.net/manual/en/funcref.php, такого пояснения не вижу.
Цитата: Demetrius от сентября 1, 2010, 11:19
Возможно, и перестаёт. Зависит от языка.
Назовите язык, пожалуйста.
Цитата: Demetrius от сентября 1, 2010, 11:19
Ту же isset удобнее заменить исключениями, но, т.к. они в PHP появились недавно, никто ещё их не использует.
Никогда не любил исключения, особенно для таких целей. Это извращение ещё большее, чем isset, косящий под функцию.
Цитата: myst от сентября 1, 2010, 11:30
Программы предназначены в первую очередь чтения людьми. Проблема ленивых кодеров решается кнутом и пряником, на худой конец — IDE.
Не все программы. Для мелких скриптов (ниша PHP) скорость написания важнее лёгкости расширения и дореработки.
Цитата: myst от сентября 1, 2010, 11:30
Цитата: Demetrius от сентября 1, 2010, 11:19
Function reference перечисляет функции и языковые конструкции, похожие на функции.
Открыл http://www.php.net/manual/en/funcref.php, такого пояснения не вижу.
А где сказано, что там только функции?
Цитата: arseniiv от сентября 1, 2010, 11:29
Цитата: Demetrius от сентября 1, 2010, 11:19
Возможно, и перестаёт. Зависит от языка.
Float(10) в паскале — тоже подпрограммах[size=10].[/size]
Там нету такого типа. :) Да и не позиционируют как функцию. А вот Exit, Break, Continue — ещё как процедуры.
Ой, там предназначался знак вопроса. =))
type
Float = Real; //кста, разве в Delphi такого нет?
begin
WriteLn(Float(10));Разве такое приведение типов не будет работать?
Цитата: myst от сентября 1, 2010, 11:30
Цитата: Demetrius от сентября 1, 2010, 11:19
Возможно, и перестаёт. Зависит от языка.
Назовите язык, пожалуйста.
Например, C, C++, Паскаль.
И не только
sizeof, но и макросы (не во всех Паскалях, но в FreePascal'е есть).
Цитата: myst от сентября 1, 2010, 11:30
Цитата: Demetrius от сентября 1, 2010, 11:19
Ту же isset удобнее заменить исключениями, но, т.к. они в PHP появились недавно, никто ещё их не использует.
Никогда не любил исключения, особенно для таких целей. Это извращение ещё большее, чем isset, косящий под функцию.
А в чём проблема?
Цитата: Demetrius от сентября 1, 2010, 11:53
Не все программы. Для мелких скриптов (ниша PHP) скорость написания важнее лёгкости расширения и дореработки.
Вы про скрипты «Hello, world», что ли? А для доработки программу приходится читать, даже аффтарам, не говоря уже о несчастных, которым приходится читать чужой write-only говнокод.
Цитата: Demetrius от сентября 1, 2010, 11:53
А где сказано, что там только функции?
В названии.
Цитата: Demetrius от сентября 1, 2010, 11:53
Например, C, C++, Паскаль.
И не только sizeof, но и макросы (не во всех Паскалях, но в FreePascal'е есть).
Приведите пример кода на любом из этих языков, где бы f(b) была подпрограммой, а f(a) не подпрограммой. То есть сущность f определялась параметром. Да, и макры сюда не надо приплетать. Это средство модификации кода.
Цитата: Demetrius от сентября 1, 2010, 11:53
А в чём проблема?
В том, что не для этого они.
Цитата: Demetrius от сентября 1, 2010, 11:53
Разве такое приведение типов не будет работать?
Будет ещё как, но там в справке это обозначается не как функция, а как отдельно приведение типа. Или хотел сказать, что выглядит как функция? Ну это, конечно, да. Кстати,
Real есть, а старый
Real, что был в паскале, заменён на
Real48. А этот синоним для
Double (а написание
Real, i℧. лучше не использовать).
Для справки.
Этот форум написан на PHP. Назвать его маленьким скриптом - язык не поворачивается. Ругать PHP просто бессмысленно. Имеет смысл сказать: "Вот это лучше". Буду рад узнать об этом.
Цитата: Ильич от сентября 1, 2010, 12:57
Ругать PHP просто бессмысленно.
Согласен, лучше закопать.
Цитата: Demetrius от августа 31, 2010, 01:12
Попробуйте заменить
$clause = $entry['extern'];
if (isset($clause)) {
на
if (isset($entry['extern'])) {
$clause = $entry['extern'];
if (isset($clause = @$entry['extern'])){
Хотя я изсеты не люблю. У меня всё заэчено обычно.
if (@$clause = $entry['extern']){
Цитата: Drundia от сентября 1, 2010, 13:46
if (isset($clause = @$entry['extern'])){
А @ — это што? :???
Цитата: myst от сентября 1, 2010, 13:48А @ — это што? :???
Это «не сообщать об ошибках».
Цитата: arseniiv от августа 31, 2010, 17:18P. S. Истинно говорю вам: что мешает рассматривать isset как функцию, берущую аргумент-ссылку? (Пока справку по PHP не открывал и не знаю, можно ли такое сделать с своими функциями.)
Можно. Более того, с каких-то пор только так и можно, если ничё назад не поменялось.
Цитата: Drundia от сентября 1, 2010, 13:56
Можно. Более того, с каких-то пор только так и можно, если ничё назад не поменялось.
То есть Вы хотите сказать, что если я сейчас создам функцию f(a){return a;} и $clause = $entry['extern'] поменяю на $clause = f($entry['extern']) , то предупреждения не будет?
Цитата: myst от сентября 1, 2010, 15:21То есть Вы хотите сказать, что если я сейчас создам функцию f(a){return a;} и $clause = $entry['extern'] поменяю на $clause = f($entry['extern']) , то предупреждения не будет?
Нет, я хочу сказать что можно объявить функцию, которая принимает аргументы по ссылке. Иначе аргументы по ссылке уже не передаются.
И ошибки кстати не будет.
Сравните:
print($a);
и
function f(&$a){
print($a);
}
f($a);
и
function f(&$a){
return $a;
}
print(f($a));
Вероятно ошибки не будет если сделать
f(&$a){return $a;} и $clause = $entry['extern'] поменяю на $clause = f($entry['extern']);
Щас проверим...
Действительно нет.
Цитата: myst от сентября 1, 2010, 12:09
Да, и макры сюда не надо приплетать. Это средство модификации кода.
То есть это не код? Не часть языка? :eat:
Цитата: arseniiv от сентября 1, 2010, 12:32
Кстати, Real есть, а старый Real, что был в паскале, заменён на Real48. А этот синоним для Double (а написание Real, i℧. лучше не использовать).
Во FreePascal'е это по любому синоним Double. А остальные компиляторы мне неинтересны.
Цитата: Demetrius от сентября 1, 2010, 19:18
То есть это не код? Не часть языка? :eat:
Макры могут раскрываться в любой текст. Какой смысл их обсуждать? И да, я не считаю их частью языка. Это отдельный язык для преобразования текста, причём любого текста. То, что их влепили в стандарт C, так это от нищеты самого С.
Цитата: myst от сентября 1, 2010, 19:28
Макры могут раскрываться в любой текст. Какой смысл их обсуждать? И да, я не считаю их частью языка. Это отдельный язык для преобразования текста, причём любого текста.
Особенно в лиспе.
Цитата: oort от сентября 1, 2010, 20:44
Цитата: myst от сентября 1, 2010, 19:28
Макры могут раскрываться в любой текст. Какой смысл их обсуждать? И да, я не считаю их частью языка. Это отдельный язык для преобразования текста, причём любого текста.
Особенно в лиспе.
Мы не про лисповые макры говорим.
Я увидел эту тему поздно, когда почти все копья уже сломаны, но все же чуть-чуть добавлю. На мой взгляд, самый страшный грех рнр -- это его ужасающая непродуманность и бессистемность. Спецмальные формы, которые и в том же лиспе есть -- это мелочь по сравнению с разными функциями mysql_connect, pg_connect, sqlite_connect и иже с ними.
Цитата: oort от сентября 1, 2010, 21:37
На мой взгляд, самый страшный грех рнр -- это его ужасающая непродуманность и бессистемность.
Так ить наколеночная поделка. Что от неё ещё ждать? :donno:
Зато ближе к естественным языкам. :)
Пичаль. :(
Интересно, в пхп собираются вводить средства для работы с юникодовскими символами?
А в чём проблема с ними?
Цитата: Python от сентября 2, 2010, 00:30
А в чём проблема с ними?
В отсутствии нормального внутреннего представления для 16- или 32-разрядных символов. И строка в windows-1251, и строка в utf-8 рассматриваются лишь как последовательность байтов — таким образом, одна буква кириллицы для php уже является двумя символами в utf-8 или одним в windows-1251. В результате, программы, предназначенные для работы с кириллицей и другими алфавитами, получаются сложнее: например, искать один символ проще, чем подстроку из двух. Код, написанный для восьмибитных кодировок, труднее приспособить для юникода. И т.д., и т.п.
По-моему там уже разные фокусы для этого есть.
Цитата: Drundia от сентября 2, 2010, 02:41
По-моему там уже разные фокусы для этого есть.
Например?
Ну хотя бы http://www.php.net/manual/en/book.mbstring.php
Много всего нужного, но не вижу, как с помощью этих функций вытащить из произвольной строки n-ный символ и, например, заменить его другим символом. В простейшем случае, все, что мне нужно — элементарный парсер для utf-8, возвращающий массив из кодов символов строки, плюс набор функций, аналогичных функциям для обычных строк, но работающий с таким массивом. Ну и обратный конвертер в utf-8 и другие кодировки.
Цитата: Python от сентября 2, 2010, 04:05
Много всего нужного, но не вижу, как с помощью этих функций вытащить из произвольной строки n-ный символ и, например, заменить его другим символом
Через попу. К примеру так:
function mb_substr_replace($s, $n, $r){
return mb_substr($s,0,$n-1,'utf-8').$r.mb_substr($s,$n,0x7fffffff,'utf-8');
}
echo mb_substr_replace('йцукенгшщзхї', 5, 'z');
// йцукzнгшщзхї
Цитата: Python от сентября 2, 2010, 00:30
Интересно, в пхп собираются вводить средства для работы с юникодовскими символами?
Так это поделие и Уникод не поддерживает? Закопать!
Цитата: myst от сентября 2, 2010, 08:40
Так это поделие и Уникод не поддерживает? Закопать!
Lua тоже не поддерживает, и что?
Цитата: Demetrius от сентября 2, 2010, 09:46
Lua тоже не поддерживает, и что?
Как что? Закопать, конечно.
Миста?
Цитата: myst от сентября 2, 2010, 12:11
Нет, PHP, Lua и jvarg.
Последний в списке - юникод поддерживает... :smoke:
Цитата: jvarg от сентября 2, 2010, 12:32
Последний в списке - юникод поддерживает... :smoke:
А его как пособника первых двух. :green:
Цитата: mystпособника
Пособник не должен был бы поддерживать... :what:
Цитата: Bhudh от сентября 2, 2010, 14:27
Пособник не должен был бы поддерживать... :what:
Следствие не проведёшь. ;)
Проклятые тоталитарные палачи...
Свободу PHP!!!
Свободу Чикатило!
Да прибудет с вами чучхе!
Да прѣбѫдєтъ съ нами чукчо!
Цитата: Python от сентября 2, 2010, 20:44
Да прибудет с вами чучхе!
И все мы немного чучхе...
Demetrius, в семантик-асках можно исключать часть результатов из вывода?