PHP: le variabili variabili sono sintassi di un esempio di riflessione?

4

Sono entrato in una conversazione con un collega e abbiamo parlato della riflessione in linguaggio PHP. Ho insistito sul fatto che istanziare istanze di classe usando la sintassi delle variabili variabili come segue è una tecnica riflessiva.

<?php

$className = 'Animal';
$animal = new $className;

Il mio collega era diverso nell'opinione. Ho fatto ricerche approfondite su google e ho persino letto questo articolo di Wikipedia sulla riflessione. Tuttavia, con mia sorpresa, nessuna delle risorse menziona esplicitamente che questa tecnica è un esempio di riflessione. Tutto quello che ottengo mentre faccio la ricerca sono i riferimenti e gli esempi all'API di Reflection.

Quindi qualcuno può rispondere alle condizioni meteo questa tecnica è un esempio di riflessione. Inoltre, se possibile, ti preghiamo di indicare una fonte autorevole che lo afferma esplicitamente.

    
posta Juzer Ali 17.11.2017 - 12:15
fonte

3 risposte

3

No

Alcune lingue dovrebbero farlo attraverso la riflessione, ma in PHP è una caratteristica di prima classe della lingua. Non è nemmeno il riflesso di usare eval per fare la stessa cosa.

Reflection prende qualcosa, un oggetto, tipo, il nome di una funzione o variabile e restituisce informazioni su di esso e ti permette di usare le informazioni restituite per fare cose (incluso possibilmente chiamare costruttori se la cosa è una classe).

Per dare un'analogia: la moltiplicazione può essere fatta tramite l'aggiunta, che non rende l'aggiunta della moltiplicazione.

In un commento all'OP @RobertHarvey si dice che non è sicuro che non sia Relection perché non è sicuro di come l'interprete sta creando il nuovo oggetto, ma gli manca il punto. Indipendentemente da come l'interprete sta ottenendo la nuova classe, non è Reflection perché non è l'APPLICAZIONE che ottiene informazioni su se stesso e quindi crea una nuova classe con tali informazioni. Se l'applicazione avesse ottenuto un elenco di nomi di classe e ne avesse selezionato uno a caso e creato la classe in quel modo, sarebbe stato Reflection. Per un'istanza concreta non è Exec o sp_execSQL che dà a TSQL la possibilità di fare Reflection, sono le viste sys e information_schema in combinazione con esse.

Suggerirei di leggere alcune delle domande che chiedono come aggiungere una riflessione alle lingue che non la supportano: link , link e link . In particolare, nota come il problema fondamentale sia che la lingua non fornisce l'accesso alle informazioni richieste o che il costrutto potrebbe non esistere in fase di runtime.

    
risposta data 21.01.2018 - 22:35
fonte
0

Penso che la chiave sia nella parte modify its own structure and behavior at runtime .

Quando scrivi un programma in uno stile più "statico", conosci in anticipo tutte le tue classi istanziate. Prendi qualsiasi schema di creazione . Tutte le classi create sono conosciute in anticipo. I loro nomi sono già presenti nel codice (e presumo che nel tuo esempio il nome della classe sia calcolato in runtime). E se non esiste una tale classe, qualsiasi linguaggio decente non verrà compilato. E il tuo collega si basa su un valore di stringa che non è noto in anticipo e definito in fase di esecuzione. Ecco una parte difficile. Da un lato, qualsiasi clausola if può essere considerata come modifica del comportamento in fase di esecuzione. Ma è sbagliato. Questo comportamento è già presente nel codice sorgente. Qualsiasi condizione produce un comportamento già definito, sia esso un nome di classe istanziato o un metodo chiamato. Ma quando definisci il nome della tua classe in anticipo, non sai per certo al 100% se risultati sempre validi per un nome di classe, ad esempio. È un po 'difficile da comprendere e concordare con esso se il tuo unico linguaggio è PHP, che è digitato dinamicamente per natura, quindi probabilmente non sembra così strano. Ma se guardassi questo problema da una prospettiva linguistica tipizzata staticamente, sarebbe perfetto.

Non sono ancora assolutamente sicuro delle mie argomentazioni, ma ho cercato di capirlo, dato che sono d'accordo con te e voglio dimostrarlo.

    
risposta data 17.11.2017 - 14:20
fonte
-4

L'articolo di wikipedia su Reflection (Programmazione per computer) ora afferma esplicitamente che l'uso in questione è un esempio di riflessione.

Inoltre nella sezione Implementazioni l'articolo descrive chiaramente la funzione riflessiva come segue:

Some of these features are the abilities to... Convert a string matching the symbolic name of a class or function into a reference to or invocation of that class or function.

Quindi, per quanto posso dire al momento, questo è un esempio di riflessione.

    
risposta data 17.11.2017 - 16:24
fonte

Leggi altre domande sui tag