OVH Cloud OVH Cloud

not found in php5...

4 réponses
Avatar
NTH
Bonsoir, je viens de faire le tour des fonctionnalités de php5 (version
5.0.1). Il y a des choses que je n'ai pas trouvées. Ai-je bien cherché?
sont-elles impossibles à implémenter? pourquoi? ou le cas échéant, elles
sont prévues mais pas encore implémentées. Bref, si vous pouviez éclairer ma
lanterne. Merci.

(à quelques erreurs de syntaxe près..)

1) surcharge d'opérateur. exemple :
class dataStatus {
const OK = 1; // type énum
const NOT_OK = 2;
...
var $status;
...
function toString() {
switch ($this->status) {
case dataStatus::OK: return "OK"; break;
...
}
}
function operator == ($status) {
return ($this->status == $status);
}
}
Comme ça on pourrait faire des type énumérés "imprimables" à l'écran. Et
puis faire :
if (myType == dataStatus::OK) echo myType->toString();
Et plein d'autres applications encore... (relations d'ordre entre objets...)

2) Surcharge d'index
class list {
private $L = array();
public $name;
...
function operator[] ($i) {
return $this->L[$i];
}
}
PS : pourquoi pas une fonction __index() ?
Comme ça on pourrait faire :
if ($list->name == 'list1') $list[2] = 2;

3) Polymorphisme :
J'ai essayé ceci dans une classe :
class x {
function f(classe1 $obj) {
}...
}
ça a l'air de comprendre qd j'appelle $objx->f(obj1)
Mais qd je déclare à la suite :
function f(classe2 $obj) {
}
Je me fais engueler : cannot redefine function f.
Ca veut dire que le polymorphisme, c'est en cours mais pas encore
complètement implété?

4) try / catch / finally?
J'ai entendu dire que finally n'est pas implémenté?

Merci beaucoup.

4 réponses

Avatar
Benoit F
1) surcharge d'opérateur. exemple :
function operator == ($status) {
function operator[] ($i) {
Impossible d'appeller de telle opération. Je ne connais que C++ pour

faire de pareilles choses. Ce qui aurait tendance à rendre le code
carément illisible. Je rapelle que java (par exemple) n'implemente pas
un tel "bouiboui" mais une fonction d'égalité nommée equals() et un
accesseur vers l'element i nommé elementAt() . Il suffit de s'adapter ça
reviens au même mais c'est à mon avis plus lisible.

2) Surcharge d'index
PS : pourquoi pas une fonction __index() ?
Elle sort d'où celle là ?


3) Polymorphisme :
Ce n'est pas ça du polymorphisme (enfin d'aprés moi)


function f(classe1 $obj) {
function f(classe2 $obj) {
Toujours impossible, à cause du typage dit "faible" de php. Peut être

dans les prochaines versions mais j'en doute. Om y a moyen de faire plus
lisible

function f($obj) {
if ($obj instanceof classe2 ) {
$this->fclasse1($obj);
} elseif ($obj instanceof classe2 ) {
$this->fclasse2($obj);
}
}

4) try / catch / finally?
J'ai entendu dire que finally n'est pas implémenté?
Effectivement, finaly n'est pas implementé


--
Benoit F.

Avatar
NTH
1) surcharge d'opérateur. exemple :
function operator == ($status) {
function operator[] ($i) {
Impossible d'appeller de telle opération. Je ne connais que C++ pour

faire de pareilles choses. Ce qui aurait tendance à rendre le code
carément illisible. Je rapelle que java (par exemple) n'implemente pas
un tel "bouiboui" mais une fonction d'égalité nommée equals() et un
accesseur vers l'element i nommé elementAt() . Il suffit de s'adapter ça
reviens au même mais c'est à mon avis plus lisible.
En C# ces 2 opérations sont possibles...

Je me répète mais :
1) c'est super sympa de pouvoir donner qq attributs en plus à un array :
if ($my_list->name == 'list') return $my_list[$i] ;
1b) écrire 400 fois :
$your_list.elementAt($i) = $my_list.elementAt($i);
c'est pénible. C'est qd même plus sympa :
$your_list[$i] = $my_list[$i];
Pour ces raisons, $my_list ne doit pas être un simple array, mais une
classe. Avec simplement - par ex - une méthode __index($i) en plus (qui
serait appelée si on fait $my_list[$i], voir plus bas). C'est pas compliqué
non?
2) Qd à la redéfinition d'opérateurs, c'est connu... c'est sympa de pouvoir
définir des relations d'ordre entre objets.
if ($myobj > $yourobj), if ($myobj == $yourobj) $myobj = 3...
Enfin les goûts et les couleurs, c'est perso...

2) Surcharge d'index
PS : pourquoi pas une fonction __index() ?
Elle sort d'où celle là ?

Je veux dire : si on fait :

class list {
private $_list = array();
...
}
$L = new list();
$a = $L[0];
la méthode __index($i) de $L serait appelée avec $i comme index
(à l'image des méthodes comme __constructor, __destructor, __isset etc.)



3) Polymorphisme :
Ce n'est pas ça du polymorphisme (enfin d'aprés moi)

Oui désolé je ne connais pas le terme exact. J'ai manqué de précision sur ce

coup là...

function f(classe1 $obj) {
function f(classe2 $obj) {
Toujours impossible, à cause du typage dit "faible" de php. Peut être

dans les prochaines versions mais j'en doute. Om y a moyen de faire plus
lisible

function f($obj) {
if ($obj instanceof classe2 ) {
$this->fclasse1($obj);
} elseif ($obj instanceof classe2 ) {
$this->fclasse2($obj);
}
}
C'est encore plus crado... mieux vaut faire f1() et f2(). Ok on peut s'en

passer sinon.


4) try / catch / finally?
J'ai entendu dire que finally n'est pas implémenté?
Effectivement, finaly n'est pas implementé

No comment, on est bien d'accord. Pourquoi?


Merci, ciao amigo.


Avatar
loufoque
NTH a dit le 19/09/2004 23:38:
function operator == ($status) {
return ($this->status == $status);
}
voir __get(), __set()...


function operator[] ($i) {
return $this->L[$i];
}
voir Iterator.


Avatar
NTH
function operator == ($status) {
return ($this->status == $status);
}
voir __get(), __set()...

Non __get et __set permettent de faire ceci :

$obj->nimportequi = nimportequoi;
dans ce cas, __set($nimportequi, $nimportequoi) serait appelée
Moi ce que je veux c'est :
$obj = 3
une autre espèce de __set($valeur) serait appelée et je ferai
$this->ma_valeur = $valeur;


function operator[] ($i) {
return $this->L[$i];
}
voir Iterator.

Ca ne répond pas à ma question à savoir écrire des [] avec un objet :

$maliste = new list();
$maliste[3] = 8;