Разница между переменными в PHP и JS

327
27 января 2017, 08:36

Здравствуйте. Скажите, пожалуйста, права ли я. Интересует больше PHP, можно ли так делать, есть ли какие-то подводные камни.

Переменную в JS нужно объявить

var a = "1";
a += 1;
alert(a); // '11'

Так работать не будет

a += 1;
alert(a);

А в PHP всё работает

$a .= 1;
echo $a; // '1'

В JS не работает

var a = '1';
if (a == '0') {b = '3';}
alert(b);

Так покажет, что переменная не существует

var a = '1';
if (a == '0') {var b = '3';}
alert(b); // undefined

Я объявляю переменную до if

var a = '1',
    b = '';
if (a == '0') {b = '3';}
alert(b); // ''

Зато так работает

var a = '1';
if (a == '1') {var b = '3';}
alert(b); // '3'

А в PHP всё работает

$a = '1';
if ($a == '1') {$b = '3';}
echo $b; // '3'

И когда переменная не объявлена, возвращается пустое значение, а не undefined

$a = '1';
if ($a == '0') {$b = '3';}
if ($b == '') echo "Hellow"; // "Hellow"
Answer 1

Потому что php берет на себя объявления переменных, делая это непрозрачно, невидимо для пользователя. Объявляются они в текущем контексте. Например:

function test(){
    $a = 'test passed';
}
test();
var_dump($a);// >>> NULL

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

function a(){
    console.log(a);
    var a = 'test';
}
//будет аналогично записи
function b(){
    var a;
    console.log(a);
    a = 'test';
}

Переменные в обоих языках объявляются в текущих контекстах, кроме того, php не ищет переменные в контексте выше(только если не используется ключевое слово global, которое позволяет использовать переменные из глобального контекста):

//php
$a = 'test';
function test(){
    var_dump($a);// >>> NULL
    $a  = 'test passed';
    echo $a;// >>> 'test passed'
}
test();
echo $a;// >>> 'test'

Однако, js "ищет" объявление переменной в контекстах, от самого вложенного, до самого общего, и если не находит, то посылает сообщение с ошибкой.

//js
var a = 'test';
var b = 'test N2';
function hax(){
    a = 'test passed';
    var b = 'test N2 passed';
    function c(){
        var a = 'test has been failed!';
        console.log(a, b) //>>>'test has been failed', 'test N2 passed'
    }
    c();
}
hax();
console.log(a, b);// >>> 'test passed', 'test N2'
Answer 2

Для того что бы проверить переменную на существование необходимо сделать if (isset($b))

READ ALSO
вылетает фатал, трабла!

вылетает фатал, трабла!

PHP Fatal error: Call to undefined method SiteController::actionIndexfsite()

317
Не выводятся большие изображения в base64

Не выводятся большие изображения в base64

ЗдравствуйтеУстановил себе на сайт графический редактор, и когда вставляю изображение и сохраняю, все данные кодируются в base64 и отправляются...

362
Почему высота 0?

Почему высота 0?

Добрый день! При поиске наибольшей высоты у элементов path в svg почему-то высота равна нулюНе пойму в чем может быть дело, возможно object не успевает...

366
Ошибка undefined is not an object (evaluating) в скрипте коллажа

Ошибка undefined is not an object (evaluating) в скрипте коллажа

Прошу помочь разобраться в ошибке, которая возникает при работе скрипта фото коллажа, описанного на хабре (https://habrahabrru/sandbox/78613/)

378