Quando meno me lo aspetto, PHP mi pugnala alle spalle

Uso PHP da parecchi anni per cui ormai ci sono talmente abituato da usarlo senza accusare particolari irritazioni di fronte alla sintassi e a certe peculiarità negative del linguaggio, a volte però mi viene voglia di prendere a martellate chi ha avuto certe pensate:

1 class BaseElement { 2 public static function static_called_by() { 3 return __CLASS__; 4 } 5 6 public function nonstatic_called_by() { 7 return get_class($this); 8 } 9 } 10 11 class MyElement extends BaseElement { } 12 13 // ------------------------------------------------------ // 14 15 $baseElement = new BaseElement(); 16 echo "1. " . $baseElement->nonstatic_called_by() . "\n"; 17 $myElement = new MyElement(); 18 echo "2. " . $myElement->nonstatic_called_by() . "\n\n"; 19 20 21 echo "3. " . BaseElement::static_called_by() . "\n"; 22 echo "4. " . MyElement::static_called_by() . "\n"; 23 24 /* 25 >C:\Programmi\php6\php.exe -f "prova.php6" 26 1. BaseElement 27 2. MyElement 28 29 3. BaseElement 30 4. BaseElement 31 >Exit code: 0 32 */

Nel caso di una classe che eredita da un’altra, all’interno di un metodo statico non c’è modo di ottenere la classe che ha invocato il metodo stesso come si farebbe invece usando get_class all’interno di un metodo di istanza mentre la costante magica __CLASS__ risulta abbastanza inutile poiché essa viene valorizzata con il nome della classe in cui è definito il metodo e non con il nome della classe da cui questo metodo è stato invocato. Ho provato anche con PHP6 nella speranza di un cambiamento di rotta per il futuro, ma niente. Ammettendo che questo sia volutamente il comportamento corretto di __CLASS__, manca comunque un modo per recuperare il nome della classe chiamante. Il comportamento che mi sarei aspettato e che secondo me ha più senso è tipo quello che otterrei in Ruby con questo codice:

1 class BaseElement 2 # metodo di classe, equivalente dello statico in PHP 3 def self.static_called_by() 4 return self.name 5 end 6 7 # metodo di istanza 8 def nonstatic_called_by() 9 return self.class.name 10 end 11 end 12 13 class MyElement < BaseElement 14 end 15 16 puts "1. " + BaseElement.new.nonstatic_called_by 17 puts "2. " + MyElement.new.nonstatic_called_by 18 puts 19 puts "3. " + BaseElement.static_called_by 20 puts "4. " + MyElement.static_called_by 21 22 =begin 23 >ruby lol.rb 24 1. BaseElement 25 2. MyElement 26 27 3. BaseElement 28 4. MyElement 29 >Exit code: 0 30 =end

Insomma, nello script PHP che stavo realizzando sono costretto a rivedere il mio approccio per questa stupidata. Dopo 8 anni, PHP a volte riesce ancora a sorprendermi negativamente.


Puoi scrivere un commento oppure inviare un trackback dal tuo sito.

2 commenti a “Quando meno me lo aspetto, PHP mi pugnala alle spalle”

  1. Purtroppo convengo con te che php ha ancora dei problemini e se sei abituato ad altri linguaggi quali java o c# allora i problemini danno ancora piu’ danno! :)

    Tuttavia php per il web e’ ancora molto molto buono tant’e’ che wordpress, joomla e altri progetti sono veramenti spettacolari!

    Complimenti per il blog veramente bello!

    Ciao

  2. Secondo me il problema principale di PHP è che soffre di inconsistenze e incoerenze sotto vari aspetti, non ne faccio una questione di paragoni o abitudini con altri linguaggi (il fatto che abbia riportato l’esempio con Ruby era per sottolineare il tipo di comportamento che sarebbe lecito pensare come possibile in quel caso).

    Non conosco Joomla (so di cosa si tratta, ma non l’ho mai usato né ho mai guardato o messo mano al codice), ma IMHO non considererei WordPress come un buon esempio da seguire alla cieca per scrivere applicazioni in PHP.

    Ah, ovviamente grazie per i complimenti :-)

Lascia un commento

Puoi utilizzare i seguenti tag XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>