2011-01-03 6 views
1

Ziel ist wie etwas zu haben:Wie definiert man Makro mit Parameter in PHP, wie es in C++ möglich ist?

#define sum(f1, f2) (f1 + f2) 

wo

sum(2,2) 

4 in PHP ist. Ist das irgendwie möglich? Noch besser wäre es, wenn ich nennen könnte:

$s = 'first'; 
APPEND ' and second'; 

wenn Appen als Funktion/Methode/etwas anderes definiert werden, die nach diesen 2 Zeilen zu $s so sind anhängen $s würde ‚erste und zweite‘ sein.

+3

Ich hoffe nicht. Andererseits hat PHP variable Variablen und auf Nachfrage 'goto' ... also habe ich wirklich Angst, es herauszufinden. Auch was ist los mit '2 + 2' oder' s. = 'Und zweiten'; '(oder, außerhalb solcher kleiner Beispiele, ** Funktionen **)? – delnan

Antwort

3

Der Punkt von Makros in C ist, dass sie zum Zeitpunkt der Kompilierung erweitert werden.

Daher hat die Verwendung der Makros keinen Einfluss auf die Geschwindigkeit Ihres Codes, die eine Funktion haben würde, die dasselbe hätte.

Daher ist ein Beispiel für die Nutzung ist:

#define MYPRINTF(x) printf("MYPRINTF says : %s\n",x) 
MYPRINTF("blah"); 

Der obige Code wird vom Compiler direkt in übersetzt werden:

printf("MYPRINTF says : %s\n","blah"); 

Der Sinn davon ist, dass es schneller ist als die Definition eine Funktion, wie diese:

void myprintf(char *x) 
{ 
    printf("myprintf says : %s\n","blah"); 
} 

da es keinen Overhead (in Funktion ist, y Sie müssen Argumente auf den Stack schieben usw.). In einer interpretierten Sprache, wie PHP, gilt das obige nicht, da alles direkt während der Laufzeit ausgeführt wird. Daher wäre die Verwendung eines Mechanismus wie C #define absolut nutzlos - also, um Ihre Frage zu beantworten, Verwenden Sie stattdessen einfach normale Funktionen.

+3

Dies ist nicht wahr, betrachte etwas wie #define errorLog (message) error_log (__ FILE __. ':' .__ LINE__. '' .message); Wenn Sie eine Methode verwenden, würde __LINE__ nicht die richtige Zeile anzeigen. (Nur als Beispiel) –

+0

Diese Antwort ist nicht wahr und deckt nicht das ganze Spektrum einer Sprache ab. Es gibt eine Situation, in der ein 'return' in einer 'define' nützlich ist. –

1

PHP unterstützt keine Makros in diesem Sinne, das (wirklich recht gültige) Argument ist meiner Meinung nach, dass es keinen großen Unterschied zwischen dieser und einer normalen PHP-Funktion gibt.

Schließlich ist es nicht so, als hätte man ein Konzept wie dieses in einer Laufzeit interpretierten Sprache.

+0

Was passiert, wenn ich eine Funktion mit Name functionWithVeryLongWroteByAnIdiot habe und sie oft verwenden muss? Ich hätte gerne Makro, also jedes Mal wenn ich secondFunction (x) schreibe, schreibe ich functionWithVeryLongWroteByAnIdiot (x). – kuba

+0

@Kuba: Sprachen, die erkannt haben, dass das Reating als "First-Class-Citizen" funktioniert, erlauben 'f = functionWithVeryLongWroteByAnIdiot'. Ich wette, PHP erlaubt dies auch, obwohl die Syntax anders sein könnte (mit Referenzen oder etwas). – delnan

+0

schreiben Sie die Funktion mit einem kleineren Namen um, vielleicht verbessern Sie auch die Funktion, um die Änderung zu rechtfertigen –

2

nur einen Gedanken aus Ihren Kommentaren

function withVeryLongWroteByAnIdiot() { 
    .... 
} 

function xFunc() { 
    return withVeryLongWroteByAnIdiot(); 
} 
+0

Besser als das: '$ short = 'functionWithVeryLongWroteByAnIdiot'; $ short ($ a, $ b); ' –

+1

Wenn es wirklich von einem Idioten geschrieben wurde, sollten Sie vielleicht ernsthaft erwägen, die Funktion selbst zu schreiben ..;) dann können Sie einen beliebigen Namen wählen .. – Lucius

0

Ich glaube nicht, dass PHP Makros unterstützt. Wenn Sie darüber nachdenken, sind Makros in C keine fancy Konstanten, vielmehr sind Konstanten die langweiligsten C-Makros der Welt. PHP versteht nur die langweilige Form durch die define function.

Das gesagt, stimme ich nicht mit den anderen Befragten über ihre Gültigkeit. Es gibt einen triftigen Grund dafür: Wenn Sie integrierte Funktionen verwenden möchten, um etwas vorzurechnen.Zum Beispiel:

macro default_if_empty_value(value, default) (empty(value) ? default : value) 

Wenn Sie versuchen, dass als eine Funktion zu schreiben, und nennt es:

default_if_empty_value($this->that['something']->or[$other], 'Not here.'); 

dann werden Sie eine PHP-Warnung erhalten, wenn ein Teil dieser variablen Kette nicht definiert ist, und die erweiterte Version ist schwieriger zu lesen:

empty($this->that['something']->or[$other]) ? 'Not here.' : $this->that['something']->or[$other]; 

PHP-Code ist kompiliert, aber es wird zur Laufzeit kompiliert. Ein solches Makro würde durch den PHP-Interpreter erweitert und dann in PHP-Bytecode kompiliert. Dieser Bytecode wird oft vom PHP-Interpreter oder einem Add-on wie APC zwischengespeichert.

Verwandte Themen