case-sensitive имена переменных, не пора ли изменить поведение php?

Статус
В этой теме нельзя размещать новые ответы.

DYPA

Настоящая dypa (c)
В последнюю неделю появилось очень много статей и записей в блогах о проблемах языка php, данная тема не является их следствием, а наоборот - первой ступенью в попытке изменить php.
Суть проблемы в следующем - от регистра написания значения переменной зависит какая это переменная, те переменные $a и $A не являются одной переменной и могут содержать два разных значения. За свою практику мне пару раз попадался код в котором авторы явно пытались прострелить себе не только ногу, но и голову используя эту возможность (обычно это были банальные ошибки и невнимательность). Сразу замечу то, что я не первый кто является противником этой особенности - первый баг найденный в bugs.php.net датируется аж 2001 годом!!!
Хотелось бы узнать ответы на такие вопросы:
- как вы считаете является ли эта возможность php способом "выстрелить себе в ногу"?
- считаете ли вы для себя это багом?
- готовы ли вы поддержать багрепорт?
- готовы ли вы предоставить патч?

код для понимания проблемы ниже:
PHP:
<?php
const A_const = 1;
echo "define A_const, defined a_const: " . (defined(@a_const) ? "true": "false") . PHP_EOL;

$A_variable = 2;
echo "set \$A_variable, isset \$a_variable: " . (isset($a_variable) ? "true": "false") . PHP_EOL;

function A() {return 3;}
echo "function A() == function a(): " . (a() == A() ? "true": "false") . PHP_EOL;

class A
{
	public $a = 1;
	public $A = 2;
	public function b()
	{
		return ($this->a == $this->A) ? true : false;
	}
	//https://bugs.php.net/bug.php?id=60833
	public function c()
	{
		self::b();
		//but not works, class SELF not found
		//SELF::b();
	}
	static public function s()
	{
		new static();
		new Static();
		new StaTiC();
		new STATIC();
	}
}
$class1 = new a();
$class2 = new A();
echo "class new A() == class new a(): " . (($class1 instanceof a && $class2 instanceof a) ? "true": "false") . PHP_EOL;
echo "a::b() == A::B(): " . (($class1->b() == $class2->B()) ? "true": "false") . PHP_EOL;
ps в ходе подготовительной работы нашел уже готовый баг репорт о проблемах резервированного слова self и патч к нему, прошу поддержать его голосованием https://bugs.php.net/bug.php?id=60833
 

cDLEON

Онанист РНРСlub
Ой, вот только давайте не будем делать из PHP делфи - я этого не переживу.
 

Redjik

Джедай-мастер
ctrl+пробел решает эту проблему - я бы оставил как есть, правда вот зарезервированные переменные привел к одному кейсу.
(чтобы было только NULL $_POST FALSE например)
 

DYPA

Настоящая dypa (c)
Ой, вот только давайте не будем делать из PHP делфи - я этого не переживу.
почему такой резкий протест? есть ли какие нить факты, которые подкрепляют мнение?

ctrl+пробел решает эту проблему
реализация IDE может быть разной, php в отличии от той же java не завязан на использование IDE (webstorm первую букву имен там очень прикольно изменяет, вижу одно - но написано то другое)
PHP:
$testId;
$testid;
$testID;
$test//тут ctrl+space
что выведет? а если переставить переменные местами?!

почему? в пятницу вечером вероятность подобной ошибки становиться совсем не нулевой, даже у человека программирующего на php 10 лет, что уж говорить о людях делающих это год или два!
 

Absinthe

жожо
DYPA согласен, а слово function заменить на gosub оператор.
И заставить писать метку перед каждой строкой.
А то фигню какую-то все пишут(функции и т.д.), ведь всем известно, что отсутствие меток - основная причина логических ошибок.
 

Вурдалак

Продвинутый новичок
Я не понимаю как можно допустить ошибку, используя IDE, которая (т.е. любая) имеет автокомплит локальных переменных.
 

cDLEON

Онанист РНРСlub
почему такой резкий протест? есть ли какие нить факты, которые подкрепляют мнение?
Покочану ©
Потому, что переменные можно запоминать не только по названию, но и по силуэту. И бегло листая найти её без особых проблем. Вы же предлагаете дать людям возможность срать в код только потому, что "работаете в пятницу вечером". А от этой проблемы обычно спасает включенный error_reporting с E_NOTICE
Я не понимаю как можно допустить ошибку, используя IDE, которая (т.е. любая) имеет автокомплит локальных переменных.
а тот же PHPStorm даже подсвечивает те переменные, которые не знает.
 

DYPA

Настоящая dypa (c)
Потому, что переменные можно запоминать не только по названию, но и по силуэту. И бегло листая найти её без особых проблем. Вы же предлагаете дать людям возможность срать в код только потому, что "работаете в пятницу вечером". А от этой проблемы обычно спасает включенный error_reporting с E_NOTICE
я предлагаю не срать в код - с именами классов и методов повального срача же не происходит. да спасает error_reporting, а ещё IDE, code review каждого куска кода, PHP_CodeSniffer, тесты для кода... список можно продолжать! Сознательно ни кто не пишет же ClaSs::meTHod() даже в "пятницу вечером". Наоборот от разнообразия нужно идти к единообразию.

Я не понимаю как можно допустить ошибку, используя IDE, которая (т.е. любая) имеет автокомплит локальных переменных.
некоторые программисты набирают код быстрее, чем IDE успевает соображать! некоторые программисты не используют IDE сознательн
 

cDLEON

Онанист РНРСlub
DYPA
я предлагаю не срать в код - с именами классов и методов повального срача же не происходит. да спасает error_reporting, а ещё IDE, code review каждого куска кода, PHP_CodeSniffer, тесты для кода... список можно продолжать!
ну и нахрена тогда, спрашивается, то, что вы предлагаете? Кстати, тесты не приплетайте - не помогут.
некоторые программисты набирают код быстрее, чем IDE успевает соображать! некоторые программисты не используют IDE сознательн
Пусть набирают немножко медленнее, но без огорода из БоЛьШих и мАлеНьКИХ букв
 

DYPA

Настоящая dypa (c)
Добавлю ещё один пример, более применимый к реальной жизни:
Допустим вы решили купить автомобиль/квартиру/участок земли, вы составляете договор в котором даете определение слову автомобиль/квартира/участок земли, далее в тексте используются слова автомобиль/квартира/участок земли, но вот незадача - приложение составлено так, что нужно написать слово Автомобиль/Квартира/Участок земли с заглавной буквы, такое бывает очень редко, например когда слово стоит вначале предложения или человек набирающий текст ошибся при наборе. Конечно предложение можно переписать, можно использовать систему автопроверки орфографии и пунктуации - но от использования заглавной буквы Автомобиль не станет тыквой с двигателем, Квартира не превратиться в шалаш, а Участок земли не станет самосвалом навоза.
 

DYPA

Настоящая dypa (c)
DYPA
ну и нахрена тогда, спрашивается, то, что вы предлагаете? Кстати, тесты не приплетайте - не помогут.
Для того что бы поведение php было более единообразным! Тесты помогут отловить ситуацию с использованием isset().
PHP:
<?php
error_reporting(E_ALL);
$Z = 1;
var_dump($z);
var_dump(isset($z));
if(!isset($z))
{
	//платеж не прошёл
}
Пусть набирают немножко медленнее, но без огорода из БоЛьШих и мАлеНьКИХ букв
По другому не умеют, уже представляю хохот - "Сегодня мы вводим ограничение на скорость набора в 10 знаков в минуту". В команде принят CamelCase - куда им деваться, переписывать все на "_"?
 

Sufir

Я не волшебник, я только учусь
авторы явно пытались прострелить себе не только ногу, но и голову используя эту возможность
Ну, и пусть прострелили-бы. В конце концов это только их
банальные ошибки и невнимательность

По моему это не самая большая и не самая важная проблема PHP (как по мне, так вообще не проблема). Не то чему стоит уделять такое внимание.
 

cDLEON

Онанист РНРСlub
Тесты помогут отловить ситуацию с использованием isset().
Чё? Т.е. echo $v = 1, isset = false ? Единообразие, говорите?
Ах да. А с индексами массивов что делать будем? Тоже регистро-независимость вводить ? А то ж ведь я и так могу $GLOBALS['v']
 

Вурдалак

Продвинутый новичок
Я даже допускаю, что по религиозным соображениям автор не может использовать нормальную IDE, но тестирование-то проводится? Неужели не лучше увидеть опечатку (Notice/exception) на этапе тестирования, чем потом видеть в коде переменные в разном регистре, потому что интерпретатор такое допускает?
 

akd

dive now, work later
Команда форума
задумался. за последние 10+ лет ни разу не возникло проблем ни с case sensitive языками ни с insensitive. просто всегда и везде имена переменных уникальны и, лично у меня, всегда CamelCase.
нахера вам патчи, в месте, где не надо ничего делать?
 

Adelf

Administrator
Команда форума
Боже ж мой :)
Проблемы возникают только у совсем новичков, которые не понимают простейших вещей.
Одна из них - ЕДИНЫЙ СТИЛЬ КОДИРОВАНИЯ. Если у тебя есть переменная $а - НИКОГДА не должно возникнуть переменной $A. Это правило. Написано оно литрами лишне-выпитого кофе.
 

Ragazzo

TDD interested
Странно, что никто не привел данную статью давнишную с хабра в качестве примера, где все описано :)
 

Absinthe

жожо
некоторые программисты набирают код быстрее, чем IDE успевает соображать!
Не верю, что можно печатать сотни-тысячи строк в минуту.

некоторые программисты не используют IDE сознательн
А некоторые сознательно мануал не читают, дальше что?

Для того что бы поведение php было более единообразным!
И чтобы те, кто знает другие языки, плевались?
Код вида var statement = new Statement() часто применяется в других языках и нисчего нехорошего не представляет.

Кстати ты так и не ответил, нравится ли тебе мое предложение о goto/gosub.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху