DYPA
Настоящая dypa (c)
В последнюю неделю появилось очень много статей и записей в блогах о проблемах языка php, данная тема не является их следствием, а наоборот - первой ступенью в попытке изменить php.
Суть проблемы в следующем - от регистра написания значения переменной зависит какая это переменная, те переменные $a и $A не являются одной переменной и могут содержать два разных значения. За свою практику мне пару раз попадался код в котором авторы явно пытались прострелить себе не только ногу, но и голову используя эту возможность (обычно это были банальные ошибки и невнимательность). Сразу замечу то, что я не первый кто является противником этой особенности - первый баг найденный в bugs.php.net датируется аж 2001 годом!!!
Хотелось бы узнать ответы на такие вопросы:
- как вы считаете является ли эта возможность php способом "выстрелить себе в ногу"?
- считаете ли вы для себя это багом?
- готовы ли вы поддержать багрепорт?
- готовы ли вы предоставить патч?
код для понимания проблемы ниже:
ps в ходе подготовительной работы нашел уже готовый баг репорт о проблемах резервированного слова self и патч к нему, прошу поддержать его голосованием https://bugs.php.net/bug.php?id=60833
Суть проблемы в следующем - от регистра написания значения переменной зависит какая это переменная, те переменные $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;