2017. szeptember 27., szerda

Szemöldökráncolás és PHP III.

Type hinting

class Task
{
    protected $title;
    protected $complete;

    public function __construct(string $title,
                                bool $isComplete = false)
    {
        $this->title = $title;
        $this->complete = $isComplete;
    }

    public function isComplete(): bool
    {
        return $this->complete;
    }
}

$task = new Task("Go to the store", "false");

var_dump($task->isComplete());

Az eredmény bool(true), ami nem meglepő, hiszen a nem nulla hosszúságú karakterláncok logikai értéke igaz, viszont ami melepő, hogy alapértelmezetten nem akad ki az interpreter. Magunknak kell rendelkeznünk arról, hogy declare(strict_types=1); hogy nehogy ilyen kis BUG forrást vigyünk a rendszerbe...

Szemöldökráncolás és PHP II.

Függvényhívás tömb paraméterrel

Kódrészlet

function addElement($list)
{
    $list[] = 4;
}

$myList = [1, 2, 3];

addElement($myList);

var_dump($myList);

Eredmény

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

Ismét csak a python-os, C#-os, Java-ás stb. beidedződés alapján azt várnám, hogy a $myList tömb négy elemű lesz, amelynek negyedik eleme 4. Value type VS Reference type. A PHP a tömböknél nem a referenciát adja át, hanem másol, gyakorlatilag érték típusként viselkedik. A megoldás & operátor alkalmazása a pareméterek definiálásánál... Az csak történelmi érdekesség, hogy PHP4-es esetében az objektumoknál is alkalmazni kellett az & operátort, például assignment esetén is. Szerencsére azóta már az objektumok Reference type-ok a PHP varázslatos világában is...

2017. szeptember 26., kedd

Szemöldökráncolás és PHP I.

Változók hatásköre

Van pár programozási nyelv, amellyel foglalkoztam és vannak titkos kedvencek is, de van hogy az embernek olyan programozási nyelvvel kell foglalkoznia, amely nem a szíve csücske, de attól még munkája során megkerülhetetlen. A legjobb tanulás, ha az ember másoknak magyarázza el az "AHA" élményeit. Tehát ez a kis sorozat amolyan személyes kis jegyzet, amely segít rögzíteni a friss élményeket.

Az alábbi kód a következő hibát dobja Notice: Undefined variable..., ami a nem túl kellemes frusztráció élményét okozza, ha az ember a python LEGB változó hatáskörének szabályain nőtt fel...

$myGlobal = 1;

function printGlobal()
{
    echo $myGlobal;
}

printGlobal();

Természetesen a PHP javára kell írni, hogy ezzel a húzással egyértelművé teszi hogy egy a függvényen belüli lokális változóval dolgozunk, vagy pedig egy globális változóval...

$myGlobal = 1;

function printGlobal()
{
    global $myGlobal;
    echo $myGlobal;
}

printGlobal();