Nota
Tutto quello che c'è da sapere su php è contenuto nel suo manuale. Il manuale php è stato tradotto nelle principali lingue europee ad eccezione dell'italiano. Prima di acquistare libri in inglese su php credo valga la pena imparare a muoversi nella documentazione ufficiale del linguaggio.
Per far questo leggerò attentamente le parti introduttive delle diverse sezioni del manuale e proverò a tradurne qualche parte. In questo modo dovrei riuscire a capire come sfruttare questa grande risorsa.
Dal momento che passerò da una sezione all'altra del manuale e salterò completamente molti argomenti, per poi tornare in seguito su alcuni di essi, prendere appunti su fogli di carta o blocchi notes renderebbe difficile ritrovare le cose e nel tempo vanificherebbe questo sforzo. Per questo ho deciso di prendere appunti utilizzando un blocco di OneNote. Ho comunque bisogno di un file php da caricare sul server per provare gli esempi riportati nel manuale. Questa pagina serve a questo.
§ Preface
Il manuale di php consiste principalmente di tre sezioni: function reference, language reference, major features, ed other supplemental information.
Sino ad ora ho utilizzato qualche volta la sezione function reference scopiazzando dai contributi degli utenti senza capirne bene la struttura. Credo sia necessario ripartire dalla sezione relativa al linguaggio. Ed è quello che farò soffermandomi sugli argomenti non trattati, o trattati marginalmente dal tutorial di w3schools.
§ Language References
Types
Objects
Object initializazion
Per creare un nuovo oggetto, usar lo statement new per instanziare una class:
<?php
class foo{
function do_foo(){
echo "Doing foo!";
}
}
?>
Doing foo!
Per una trattazione completa, vedi il capitolo Classes and Objects
Conversione ad oggetto
- Un object convertito ad object, non subisce modifiche.
- Quando una variabile di altro tipo è convertita ad oggetto, viene istanziato un oggetto della stdClass.
- Se il valore della variabile convertita è NULL, la nuova istanza sarà vuota.
- Un array convertito ad object prudurrà un oggetto con properties name-value corrispondenti alle coppie key-value dell'array di partenza.
- In un oggetto derivante dalla conversione di un array con keys di tipo numerico le properties non sono accessibili tramite il nome, ma potranno essere recuparate tramite iterazione sul loro insieme.
<?php
$obj = (object) array('1' => 'foo');
var_dump(isset($obj->{'1'})); // outputs 'bool(false)'
var_dump(key($obj)); // outputs 'int(1)'
?>
Ecco come si accede alle proprietà di un oggetto derivante dalla conversione di un array con keys numeriche:
<?php
$obj0 = (object) array('html','css', 'js', 'php');
foreach($obj0 as $key=>$value){
echo nl2br("$key" . "=>". $value. "\n");
}
?>
1=>css
2=>js
3=>php
Istanza di oggetti generici vuoti
In PHP 7 ci sono diversi modi per creare oggetti vuoti.
<?php
/*Questo è il modo più semplice*/
$genericObject = new stdClass();
echo "\$genericObject - ";
var_dump($genericObject);
echo nl2br("\n");
/*Questi sono gli altri metodi*/
$obj1 = new \stdClass; // Instantiate stdClass object
$obj3 = (object)[]; // Cast empty array to object
echo "\$obj1 - ";
var_dump($obj1);
echo nl2br("\n");
echo "\$obj3 - ";
var_dump($obj3);
echo nl2br("\n");
/* Questo non funziona con la versione 5.6.30 con la versione 7.0.19 funziona.*/
$obj2 = new class{}; // Instantiate anonymous class
echo "\$obj2 - ";
var_dump($obj2);
echo nl2br("\n");
?>
$obj1 - object(stdClass)#5 (0) { }
$obj3 - object(stdClass)#6 (0) { }
$obj2 - object(class@anonymous)#7 (0) { }
Callbaks / Callable
Alcune funzioni, come call_user_function() e usort(), accettano come parametri chiamate a funzioni o a metodi compresi i metodi statici o di classe.
Parametri come questi sono detti di tipo callable o callback.
I parametri di chiamata di funzioni sono stringhe contenti il nome della funzione che si desidera chiamare. Non sono ammessi i nomi dei costrutti del linguaggio quali array(), echo, empty(), eval(), exit(), isset(), list(), print(), unset().
I parametri di chiamata di metodi sono array contenenti, nell'ordine, il nome dell'oggetto ed il nome del metodo.
Ecco qualche esempio:
<?php
// Un esempio di funzione richiamabile
function my_callback_function() {
echo nl2br("hello world!\n");
}
// Un esempio di metodo richiamabile
class MyClass {
static function myCallbackMethod() {
echo nl2br("Hello World!\n");
}
}
// Type 1: Chiamata di funzione
call_user_func('my_callback_function');
// Type 2: Chiamata di metodo statico
call_user_func(array('MyClass', 'myCallbackMethod'));
// Type 3: Chiamata di metodo di oggetto
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
// Type 4: Chiamata di metodo statico (Formato di PHP 5.2.3)
call_user_func('MyClass::myCallbackMethod');
// Type 5: Chiamata di metodo statico relativo (Formato di PHP 5.3.0)
class A {
public static function who() {
echo nl2br("A\n");
}
}
class B extends A {
public static function who() {
echo nl2br("B\n");
}
}
call_user_func(array('B', 'parent::who')); // A
// Type 6: Oggetti che implementano il metodo __invoke possono essere usati come callables
(dalla versione PHP 5.3)
class C {
public function __invoke($name) {
echo nl2br("Hello ". $name. "\n");
}
}
$c = new C();
call_user_func($c, 'PHP!');
?>
Hello World!
Hello World!
Hello World!
A
Hello PHP!
Un esempio di richiamata usando una "Closure"
<?php
// La nostra chiusura
$double = function($a) {
return $a * 2;
};
// Questo è il nostro intervallo di numeri
$numbers = range(1, 5);
/* Uso la closure come una callback per raddoppiare il valore di ognuno degli elementi nel
nostro range
*/
$new_numbers = array_map($double, $numbers);
print implode(' ', $new_numbers);
?>