2010-02-26 29 views
0

Voici le code:J'ai de la difficulté à comprendre ce code PHP très simple. S'il vous plaît aider?

<?php 

class Order extends Zend_Db_Table_Abstract 
{ 
protected $_name = 'orders'; 

protected $_limit = 200; 

protected $_authorised = false; 

public function setLimit($limit) 
{ 
$this->_limit = $limit; 
} 

public function setAuthorised($auth) 
{ 
$this->_authorised = (bool) $auth; 
} 

public function insert(array $data) 
{ 
if ($data['amount'] > $this->_limit 
&& $this->_authorised === false) { 
throw new Exception('Unauthorised transaction of greater than ' 
. $this->_limit . ' units'); 
} 
return parent::insert($data); 
} 
} 

Dans l'insert de la méthode(), qu'est-ce que parent::insert($data) faire? Est-ce qu'il s'appelle? Pourquoi ferait-il ça? Pourquoi cette instruction de retour est-elle exécutée, quelle que soit la condition IF?

Répondre

2

Il appelle la méthode insert sur la classe Zend_Db_Table_Abstract. L'instruction return ne sera exécutée que si le conditionnel échoue. Throw new Une exception lèvera une exception et renverra l'exécution à l'endroit qui a invoqué la méthode.

+0

Merci, vraiment éclairci les choses. :) –

0

parent::insert($data) appels la mise en œuvre des parents de la fonction insert(), à savoir celui de Zend_Db_Table_Abstract

De cette façon, il est possible d'ajouter une vérification personnalisée à la nouvelle classe, et font encore l'utilisation du code l'implémentation de la classe parent (au lieu de devoir copier + le coller dans la fonction).

-1
<?php 

class Order extends Zend_Db_Table_Abstract 
{ 
protected $_name = 'orders'; 

protected $_limit = 200; 

protected $_authorised = false; 

public function setLimit($limit) 
{ 
$this->_limit = $limit; 
} 

public function setAuthorised($auth) 
{ 
$this->_authorised = (bool) $auth; 
} 

public function insert(array $data) 
{ 
if ($data['amount'] > $this->_limit 
&& $this->_authorised === false) { 
throw new Exception('Unauthorised transaction of greater than ' 
. $this->_limit . ' units'); 
} 
return $this->insert($data); 
} 
} 

Appelez cette classe

$order = new Order(); 
$order->insert($data); 
+0

c'est faux, et provoquerait une récursion infinie. –

+0

Je ne pense pas que cela se passera comme vous le pensez. – jasonbar

+0

Problème simple, solution simple. –

0

parent:: est similaire au mot-clé self:: ou YourClassNameHere:: en ce qu'il est utilisé pour appelé une fonction statique, à l'exception parent appellera la fonction qui est définie dans la classe la classe actuelle s'étend.

En outre, une instruction throw est un point de sortie d'une fonction, donc si le lancement est exécuté, la fonction n'atteindra jamais l'instruction return. Si une exception est levée, il appartient à la fonction appelante d'intercepter et de traiter l'exception à l'aide de try et catch ou de permettre à l'exception de se propager plus loin dans la pile d'appels.