Domanda

PHP, come tutti sappiamo, è tipizzato molto liberamente. Il linguaggio non richiede di specificare alcun tipo di tipo per parametri di funzione o variabili di classe. Questa può essere una potente funzionalità.

A volte, però, può rendere il debug del tuo script un'esperienza dolorosa. Ad esempio, passare un tipo di oggetto in un metodo che prevede un diverso tipo di oggetto può produrre messaggi di errore in cui si afferma che una determinata variabile / metodo non esiste per l'oggetto passato. Queste situazioni sono per lo più fastidi. Problemi più onerosi si verificano quando si inizializza un oggetto con un oggetto della classe errata e quell'oggetto "errato" non verrà utilizzato più avanti nell'esecuzione dello script. In questo caso si ottiene un errore molto più tardi rispetto a quando si è superato l'argomento originale.

Invece di lamentarmi del fatto che ciò che ho passato non ha un metodo o una variabile specifici, o aspettare molto più tardi nell'esecuzione dello script per utilizzare l'oggetto passato in uso, Preferirei di gran lunga avere un errore messaggio, esattamente dove specifico un oggetto del tipo sbagliato, lamentandomi che il tipo di oggetto sia errato o incompatibile.

Come gestisci queste situazioni nel tuo codice? Come si rilevano i tipi incompatibili? Come posso introdurre una verifica del tipo nei miei script in modo da poter comprendere più facilmente i messaggi di errore?

Inoltre, come puoi fare tutto questo tenendo conto dell'eredità in Php? Prendere in considerazione:

<?php
class InterfaceClass
{
#...
}

class UsesInterfaceClass
{
   function SetObject(&$obj) 
   {
       // What do I put here to make sure that $obj either
       // is of type InterfaceObject or inherits from it       

   }
}
?>

Quindi un utente di questo codice implementa l'interfaccia con la propria classe concreta:

<?php

class ConcreteClass extends InterfaceClass
{
}



?>

Voglio che anche le istanze di ConcreteClass e tutti gli oggetti definiti dall'utente futuri e sconosciuti siano accettabili per SetObject. Come lo renderesti ammissibile controllando il tipo corretto?

È stato utile?

Soluzione

In realtà per le classi puoi fornire suggerimenti sul tipo in PHP (5+).

 <?php
 class UsesBaseClass
 {
      function SetObject(InterfaceObject $obj) 
      {
      }
 }
 ?>

Funzionerà correttamente anche con l'eredità come ci si aspetterebbe.

A parte questo, non mettere la parola "oggetto" nei nomi delle tue classi ...

Altri suggerimenti

come aggiunta alla risposta di Eran Galperin puoi anche usare il suggerimento tipo per forzare i parametri ad essere array - non solo oggetti di una certa classe.

<?php
class MyCoolClass {
   public function passMeAnArray(array $array = array()) {
      // do something with the array  
   }  
 }  
 ?>

Come puoi vedere, puoi suggerire che il metodo :: passMeAnArray () prevede un array , oltre a fornire un valore predefinito nel caso in cui il metodo sia chiamato w / o qualsiasi parametro.

Per i tipi primitivi puoi anche usare le funzioni is_ *:

public function Add($a, $b)
{
  if (!is_int($a) || !is_int($b))
    throw new InvalidArgumentException();
  return $a + $b;
}

Vedete, ci sono più risposte sul suggerimento per tipo. Questa è la soluzione tecnica. Ma dovresti anche assicurarti che l'intero design sia sensibile e intuitivo. Ciò renderà più rari i problemi di tipo e gli errori.

Ricorda che anche questi errori di tipo verranno generati in fase di esecuzione . Assicurati di avere dei test per il codice.

Anche nel caso che descrivi, il tuo script andrà in crash, lamentandosi che non esiste alcun metodo / attributo X sull'oggetto Y, quindi saprai da dove viene.

Comunque, penso che cercare sempre di impedire ai programmatori cresciuti di passare un oggetto sbagliato a un metodo non è un buon investimento: potresti invece spenderlo nella documentazione e nella formazione.

Digitare l'anatra e fare attenzione ai colleghi è ciò di cui hai bisogno, non ulteriori controlli che renderanno la tua app più rigida.

Ma potrebbe essere un punto di vista di Pythonista ...

@ Eran Galperin La risposta è il metodo preferito per garantire che l'oggetto che stai usando sia del tipo corretto.

Vale anche la pena notare l'operatore instanceOf - è utile per quando si desidera verificare che un L'oggetto è di diversi tipi.

Puoi impostare l'impostazione ini error_reporting nel tuo file php.ini o utilizzare la funzione error_reporting per impostarlo in fase di esecuzione

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top