Странни Оператори и знаци в PHP

Pregleda 6122 | Коментари

Ако погледнете документацията на PHP, със сигурност сте видяли, че има доста символи и оператори, някои от които изглеждат доста странно.  Някои изглеждат така : !, -, =>, <=>, ^ или ~ , други са четими като : AND, OR, или XOR.

Освен в документацията, ако започнем да гледаме и в codebase-a на езика, могат да се изровят страхотни гемове. Нека да разгледаме, най-интересните от тях, които успях да открия в интернет.

1 Оператор []=

$arr =  array(1,2,3,4,5,6);
$arr []= 7;
echo '<pre>' , var_dump($arr) , '</pre>';

Като резултата е очакван, добавихме към края на масива елемент със стойност 7.  Не съм виждал въпросния оператор досега, не мисля, че се използва често, именно затова е тук.

 2 Оператор b’

<?php
$var = b'zdrasti'; // output: 'zdrasti'
$var2 = B'zdrasti'; // output: 'zdrasti'
$var3 = c'zdrasti pak'; // не работи

Добавете b или B пред даден стринг и резултата ще е никакъв : ) .  Само b и B "работят", ако може да се нарече работа, дотолкова че да не изпищи някоя грешка.  Въпросния "оператор" липсва и в документацията.  b' прилича доста на 6, което явно е оставено за да показва съдбата на PHP 6 : ) .  Ето и какво изнамерих в StackOverflow относно b'

This is a forward compatibility token for the never-to-be-released PHP version 6, which should have had native unicode support.In PHP6, strings are unicode by default, and functions operate at the unicode character level on them. This "b" means "binary string", that is, a non unicode string, on which functions operate at the byte level.

 

3 Стрелкичка Наляво <-

Стрелкичката надясно "->" ни е до болка позната, предимно от property-та  и chain-ване на методи.  Стрелкичката наляво е била имплементирана преди доста време, като идеята е била да може да се пише RTL ( отдясно наляво ), навярно за да улесни езици и народности, които не пишат отляво надясно. Разбира се, самата идея пропада по разбираеми причини, но оператора е оставен така или иначе

<?php
Class Human {
    public $age;

    public function __construct($age) {
        $this->age = $age;


    }
}
$var = new Human(28);
echo $var->age; // резултата е 28 

30<-$var->age; 
var_dump(30<-$var->age); // все още е 28
echo $var->age; // 28 отново : )))

За пример имаме един клас Човек, който си има свойството години. Правим инстанция и сетваме годините на 28. След като използваме <- оператора няма грешка, нито warning, но пък резултата не се променя. ако опитаме да присвоим операцията с въпросния оператор към променлива или пък използваме var_dump, резултата е false. Това е бил първият оператор, който е разработен спрямо RTL, който впоследствие са го оставили в PHP

4 Супер object оператор – – >

<?php
Class Human {
    public $age;
    public function __construct($age) {
        $this->age = $age;

    }
}
$person = new Human(20);
$integervar = 10;
echo $integervar--> 50; // ???  // не прави нищо, 
var_dump($integervar--> 50); // показва bool(false)
echo $person-->age; // Warning: Use of undefined constant age

Така и не успях да разбера какво прави --> , интересно поведение има, защото работи коректно, тоест не прави нищо, освен да показва false, само върху integer.  Навярно е някакво поведение, което впоследствие е било изоставано, а оператора е останал в езика.

edit:

Колкото и да си играх, така и не успях да накарам въпросния оператор да направи каквото и да било, осен да трещи грешки, когато не се използва integer.  Надявах се, че това ще заработи, но уви нищо не се случва:

<?php
$i = 1;
while ($i--> 5) { 
    echo $i . '<br>';
    $i++;
 }

5 <= :Лява стрелкичка за масиви  [ $a <= $b ]

<?php
$array = ['a'  => 'b',
'c' <= 'd', ];

echo '<pre>', var_dump($array) , '<pre>';

/*
array(2) {
  ["a"]=>
  string(1) "b"
  [0]=>
  bool(true)
}
*/ 

=> ни е познат, но интересно е поведението на огледалния му братовчед <= . Ако очаквахте горния код да се опита да сравни двете стойности- не. Това, което прави всеки път е да обърне c и d в примера, на bool True.  ???

 

6 Боен Кораб  :    <=>

PHP 7 ни дава възможност да използваме цяла флотилия от бойни кораби оператори.  Първи към флотилията е <=>

<?php
// Числа 

echo 1 <=> 1; // 0
echo 3 <=> 4; // -1
echo 4 <=> 3; // 1

//Стрингове 
echo "x" <=> "x"; // 0
echo "x" <=> "y"; //-1
echo "y" <=> "x"; //1

Всъщност бойният кораб е полезен донякъде.

  • Връща 0 ако и двете страни са еднакви
  • Връща  -1 ако елемента отдясно е по-голям
  • Връща 1 ако елемента отляво е по-голям

7 Малък Боен Кораб  :   -=-

Малкия боен кораб, просто прибавя стойността на едната променлива към другата.

<?php
$a = 5;
$b = 10;
$a -=- $b;
echo $a; // 15 

 

8 Кораб Разузнавач  #1 : +-0-+ и #2: -+0+-

Една флотилия не може ако няма кораби разузнавачи. Двата оператора премахват или добавят дадена стойност към променлива:

<?php
$a = 5;
$b = 10;
$a = $a +-0-+ 3;
$b = $b -+0+- 3;
echo $a; // 2 
echo '<br>';
echo $b; // 7

 

9 Кораб изтребител : <=['-']=>

$x = [ 2 <=['-']=> $b];

$x = [ 1 => $b]; // прави същото като това

Изтребителят е оператор, който може да се използва само при масиви. Изключително стилен и лесен за четене, легендите гласят, че се използва изключително много в проекти, включващи индийци.

 

10 -  Тактически разузнавач:++-++

<?php
$a = 5;
$a = $a ++-++ $a;
echo $a; // -2 

Коментари

За Връзка
Можете да ми пишете на remindbg @ gmail.com