Come eseguire un compito di valutazione di variabili e formule modificabili, utilizzando PHP?

3

Attività come definita:

L'utente deve essere in grado di definire le proprie variabili e formule per operare su tali variabili, in modo da ottenere l'output in base ai propri input. Poiché le formule e le variabili e i loro input cambiano spesso, l'utente deve avere il controllo.

Esempio

//inputs (may be entered directly or provided by database)
$a = 4;
$b = 6;

//formulas:
$c = $a + $b * 5.35;

//outputs
print $c;

Questo deve essere inserito da un utente in una casella di testo su un sito Web e deve essere salvato come "modello principale" da utilizzare per calcolare i calcoli dell'autore.

Thought # 1

Usa PHP Eval : (funzione che esegue un codice sorgente arbitrario)

Ma ...

If eval() is the answer, you're almost certainly asking the wrong question.
-- Rasmus Lerdorf, BDFL of PHP

ma eval () potrebbe effettivamente funzionare bene per questo, ma ciò significa

  • input disinfettanti
  • output di filtraggio
  • consente all'utente previsto e agli utenti inattesi (malevoli) di eseguire gratuitamente eval
  • insegnamento dell'insieme di sottoinsiemi di PHP

Thought # 2

Implementa un parser semplice per un linguaggio semplice (cioè in grado di elaborare l'esempio precedente). È un po 'più di lavoro, o un po' di lavoro in più a seconda di quale funzionalità gli utenti chiederanno e come si svilupperà il progetto in futuro.

Domanda

Ci sono altri modi per risolvere questo problema? In effetti, sto progettando un modulo che dovrebbe funzionare come un foglio di calcolo mini-Excel, con il potere di usare formule e variabili arbitrarie modificabili dall'utente e output.

    
posta Dennis 22.09.2015 - 20:04
fonte

2 risposte

7

Una ragione per cui "quasi certamente stai ponendo la domanda sbagliata" è che l'igienizzazione e il filtraggio correttamente richiedono analisi. In altre parole, è necessario implementare il pensiero n. 2 al fine di implementare il pensiero n. 1 in modo sicuro per l'input non attendibile. La maggior parte delle persone non se ne rende conto e così finiscono per fare un lavoro molto povero. Fidati di me (e fidati di Rasmus Lerdorf per questo), stai meglio mordendo il proiettile e andando con un parser adeguato fin dall'inizio.

Google "Generatore di parser PHP" per molte risorse per iniziare. C'è un po 'di una curva di apprendimento, ma fortunatamente per te, la valutazione delle espressioni matematiche è il "mondo ciao" di questi tipi di librerie.

    
risposta data 22.09.2015 - 21:09
fonte
3

C'è un problema XY che gira intorno a questa domanda. Proverò a rispondere ad entrambe le parti.

Dai commenti, il problema principale:

I am trying to ease the job of the people in my company who came to me requesting to find a better solution than using Excel spreadsheets to do various custom-product computations, that change frequently. They want to move away from Excel, and onto the web, and they want to be able to update formulas and variables themselves. Excel is not on the web and they have to pass excel sheets to each other each time they make a change, creating tons of outdated excel sheets in the process that linger on people's machines. I am to try and make this process better.

Questo è un problema di gestione dei contenuti, non di programmazione. Stai cercando soluzioni che implichino l'uso di Excel sul web. Un'opzione è una soluzione di gestione dei contenuti aziendali come Sharepoint. Un'altra è la Excel Web App . Questo è il problema che stai davvero cercando di risolvere: avere un'unica fonte coerente di dati e calcoli.

Ora, "proviamo a implementarlo in un'altra lingua". Le tue opzioni sono:

  • La lingua piena non sicura con eval
  • Scrittura di un linguaggio specifico di dominio potente come Excel

Bisogna capire che il foglio di calcolo è, al suo centro, un linguaggio funzionale con equazioni e dati mappati su un piano cartesiano di righe e colonne.

Stai per correre a capofitto nella decima regola di Greenspun

Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp.

Stai scrivendo un altro linguaggio funzionale in php (se sei fortunato - questo è per aiutare gli utenti a conservare il maggior numero di competenze da Excel a questa lingua). Stai cercando di farlo in modo che sia "sicuro" e "facilmente comprensibile da qualcuno che non ha più esperienza di programmazione rispetto alla scrittura di equazioni di Excel" (e privo della verifica utile che excel ti fornisce).

Stai andando a mantenere queste informazioni (il codice è dati) in un database (se sei fortunato - qualche altro data store se non lo sei) in qualche modo , tiralo fuori dalla persistenza , valuta tutto al volo, permetti a qualcuno di cambiare, la gestione dei contenuti in cima a quella (chi ha apportato la modifica?), e la possibilità di fare versioni anche una volta che hai finito il progetto.

La cosa che finirai per edificare per cercare di supportare il problema centrale non sarà piccola. Ogni volta che ti rivolgi agli utenti chiederai un'altra funzione da aggiungere . Potresti aggiungere ACCRINT ? Che ne dici di LINEST ? Come faccio a fare un LOOKUP o VLOOKUP in questa lingua?

Questa è una meravigliosa idea di avere un team di programmatori di talento su cui lavorare come prodotto da vendere. È un compito impossibile per un progetto collaterale per un singolo programmatore (o anche un piccolo team) con altre priorità e incendi in corso.

Non sto dicendo che non puoi farlo. Ma il problema che stai cercando di risolvere con questa soluzione non sarà nemmeno una soluzione adatta per i nastri adesivi per qualsiasi periodo di tempo ... e il supporto dell'applicazione ipotetica sarà un lavoro a tempo pieno.

Utilizza uno strumento esistente che risolva il tuo problema. Il suo prezzo è probabilmente una piccola frazione di un FTE.

    
risposta data 23.09.2015 - 02:32
fonte

Leggi altre domande sui tag