2013-07-19 15 views
7

Ho bisogno di aiuto per capire il tipo di suggerimento con gli oggetti. Ho provato a cercare stackoverflow ma non riesco a trovare nulla che abbia un altro utente che ne spieghi l'uso. Se ne trovi uno fammi sapere. Prima lasciatemi spiegare cosa capisco.tipo di oggetto suggerimento in php

Quando si utilizza un suggerimento tipo di matrice, l'utente deve digitare un parametro che è una matrice, altrimenti si verificherà un errore.

<?php 
function something(array $myval) 
{ 
    return print_r($myval); 
} 

Quando provo con un oggetto ottengo un errore. Potrei scrivere male, ma per favore aiutami a capire come scriverlo.

<?php 
class Person 
{ 
    function name($name) 
    { 
     return $name; 
    } 
} 

$foo = new Person(); 

function doSomething(Person $lname) 
{ 
    return $lname->name; 
} 

doSomething('smith'); 

Da quello che ho capito quando una funzione è di tipo accennato della persona oggetto (in questo esempio) la variabile parametro avrà accesso ai metodi di oggetti proprio come quando si crea un'istanza di un oggetto e echo i suoi metodi. Posso sbagliarmi ma per favore correggimi. L'altra mia domanda è che se questo è vero dove un parametro Person ha accesso ai metodi Person, ciò rende questo diverso dall'istanza semplice della classe Person e dall'evocazione manuale dei metodi.

+0

possibile duplicato di [Suggerimento tipo PHP: array supportato, oggetto NOT?] (Http://stackoverflow.com/questions/1547696/php-type-hinting-array-supported-object-not) –

+0

Stai ottenendo un errore perché ''smith'' è una stringa e non un oggetto. Devi passare '$ pippo' a' doSomething() 'perché funzioni. –

+0

* "Ho provato a cercare stackoverflow" * - hai provato a cercare nella documentazione? Tutto è [spiegato] (http://www.php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration) lì, con esempi. – axiac

risposta

12

Usando il tuo esempio:

$foo = new Person; 
$foo->name = 'smith'; 

$something = doSomething($foo); 

echo $something; 

Tipo hinting significa che tutto ciò che si passa deve essere un'istanza (dello stesso tipo) il tipo che stai suggerendo.

Pertanto, se si fa riferimento a Person, verranno accettati solo gli oggetti di quel tipo.

Nell'esempio che hai fornito, hai provato a passare una stringa anziché un oggetto.

Aggiornamento

"Tipo hinting" forze di passare solo gli oggetti di un determinato tipo. Ciò ti impedisce di trasmettere valori incompatibili e crea uno standard se lavori con un team, ecc.

Quindi, supponiamo che tu abbia una funzione sing(). Vuoi essere sicuro che accetterà solo oggetti di tipo Song.

Creiamo la nostra classe Song:

class Song{ 

public $title; 
public $lyrics; 

} 

e la nostra funzione cantare(). Noi tipo di suggerimento per Song per garantire che nessun altro tipo di params può essere passato a esso:

function sing(Song $song){ 

echo "Singing the song called " .$song->title; 
echo "<p>" . $ong->lyrics . "</p>"; 

} 

Ora, ancora una volta, la funzione può accettare solo oggetti di tipo Song perché è quello che abbiamo accennato nella dichiarazione (Song $song).

Creiamo una canzone e passarlo:

$hit = new Song; 

$hit->title = "Beat it!"; 
$hit->lyrics = "It doesn't matter who's wrong or right... just beat it!"; 

poi ci chiamano:

sing($hit); 

che lavorerà bene.

Ora, diciamo che abbiamo una classe Poem:

class Poem{ 

public $title; 
public $lyrics; 

} 

$poem = new Poem; 

$poem->title = "Look at the sea"; 
$poem->lyrics = "How blue, blue like the sky, in which we fly..." 

Se proviamo a chiamare usando la nostra funzione di 'cantare';

sing($poem) 

otterremo un errore perché $poem non è il tipo di oggetto che abbiamo accennato al momento della creazione della funzione di sing().

+0

@Exploit È necessario creare un'istanza dell'oggetto prima di passarlo. Ecco perché stai ricevendo l'errore: hai appena passato una stringa. Il suggerimento di tipo non trasforma il parametro che si passa in un oggetto. –

+1

Perché il voto negativo? –

+1

mi dispiace per il voto che il mio dito ha fatto clic sul mouse e non sono riuscito a riportarlo a zero. Ho intenzione di provare un altro campione sul mio computer e pubblicheremo un aggiornamento. Per qualche ragione, quando provo da solo, continuo a ricevere errori. Se non ti dispiace puoi pubblicare un campione funzionante in una risposta? forse mi aiuterà a capire meglio grazie –

Problemi correlati