2012-03-22 4 views

risposta

4

L'estensione Readline non è disponibile su Windows. Penso che sia possibile compilare PHP sotto cygwin abilitando l'opzione --with-readline

+0

La domanda che chiedo da anni è, * perché * questa funzione di base, essenziale, non è disponibile su Windows? Se il sistema operativo non offre nulla di equivalente, sicuramente potresti emularlo. –

+1

Cinque anni più tardi, da PHP v7.1 readline è ora disponibile su Windows – icc97

0

Considerando la risposta di galymzhan, un'altra opzione per eseguire PHP in modalità interattiva su Windows sarebbe quella di utilizzare uno dei REPL di PHP. Non si ottiene il completamento del tab, dal momento che si basa su readline.

Il REPL che ha funzionato per me finora è PHP-Shell

http://jan.kneschke.de/projects/php-shell/

+0

Il sito Web non è più disponibile :( – icc97

2
//The readline library is not available on Windows. 

<?php 
     if (PHP_OS == 'WINNT') { 
      echo '$ '; 
      $line = stream_get_line(STDIN, 1024, PHP_EOL); 
     } else { 
       $line = readline('$ '); 
       } 
?> 

Ho trovato questo codice direttamente fuori dalla documentazione di PHP. Come puoi vedere, non esiste alcun supporto per la libreria readline in macchine Windows (almeno in un pacchetto ddefault) che fa schifo ma puoi ottenere qualcosa di simile facendo "$ line = blah, blah" che vedi nel codice sopra.

L'ho provato e ho funzionato usando il cmd standard della finestra (anche se penso che la modalità PHP interattiva non funzionerà in Windows, non importa quale) ma è meglio che non avere alcun input da parte dell'utente (se in realtà si riesce a ricordare tutto quel codice).

1

Questo potrebbe essere un po 'in ritardo, ma ecco la soluzione che ha risolto questo problema per me: Nello stile di C#' s Console, ho scritto un po 'di classe che può fare un readLine() così come un writeLine($str):

class Console { 
    const READLINE_MAX_LENGTH = 0xFFFF; 
    const WRITELINE_NEWLINE = "\n"; 

    private static /*Resource*/ $stdin; 
    private static /*Resource*/ $stdout; 

    public static function /*void*/ close() { 
     fclose(self::$stdin); 
     fclose(self::$stdout); 
    } 

    public static function /*void*/ open() { 
     self::$stdin = fopen('php://stdin', 'r'); 
     self::$stdout = fopen('php://stdout', 'w'); 
    } 

    public static function /*string*/ readLine() { 
     return stream_get_line(self::$stdin, self::READLINE_MAX_LENGTH, "\r\n"); 
    } 

    public static function /*void*/ writeLine (/*string*/ $str) { 
     fwrite(self::$stdout, $str); 
     fwrite(self::$stdout, self::WRITELINE_NEWLINE); 
    } 
} 
utilizzo

Esempio:

Console::open(); 
echo "Input something: "; 

$str = Console::readLine(); 
if (is_string($str)) 
    Console::writeLine($str); 
else 
    echo "ERROR"; 

Console::close(); 

EDIT: Questo metodo funziona ovviamente solo se t il processo genitore non cambia STDOUT o STDIN.