WinFuture-Forum.de: Verständnisfrage PHP function_exists - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Verständnisfrage PHP function_exists

#1 Mitglied ist online   Gispelmob 

  • Gruppe: aktive Mitglieder
  • Beiträge: 929
  • Beigetreten: 14. August 15
  • Reputation: 80

geschrieben 13. Mai 2017 - 07:40

Ich hab in einer Klasse einen Selbstest eingebaut der verwendete PHP Funktionen prüfen soll, ob diese vom Server aus gesperrt sind oder nicht.

static function check_needed_functions() {

	$function_array = self::$_class_needed_functions;

        $passed = " - <i>passed</i>";
        $failed = " - <i><font color=\"red\">failed</font></i>";
        $result = "";

	foreach ($function_array as $key => $value) {
	
		$result .= "<br/> - " . $function_array [$key];

		if (!function_exists($function_array [$key])) {
			
			$result .= $failed;

		} else {
			
			$result .= $passed;

		}

	}

	return $result;

}

Die genutzten Funktion liegen in einem einfachem Array

static $_class_needed_functions = array(

	/* php function name */
	//"array",
	//"class",
	//"const",
	"count",
	"define",
	"defined",
	//"die",
	"dirname",
	"file_exists",
	"filter_var",
	//"foreach",
	//"function",
	"function_exists",
	"htmlspecialchars",
	"is_dir",
	//"isset",
	//"namespace",
	"phpversion",
	//"print",
	//"require_once",
	"str_replace",
	"version_compare"

);

Wie man sieht musste ich einige Funktionen wie array, const, die, foreach usw. ausklammern, weil die Prüfung immer negativ ist. Diese Funktionen sind aber nutzbar. Warum ist der Test trotzdem immer negativ?

Dieser Beitrag wurde von Gispelmob bearbeitet: 13. Mai 2017 - 12:39

0

Anzeige

#2 Mitglied ist offline   Stefan_der_held 

  • Gruppe: Offizieller Support
  • Beiträge: 12.712
  • Beigetreten: 08. April 06
  • Reputation: 399

geschrieben 13. Mai 2017 - 11:50

Gut... PHP-Klassenprogrammierung ist nicht so meins... aber mal daher eine Frage eines "außenstehenden mit unvoreingenommenen Augen":

Wieso machst du die Abfrage erst "Fehlerfall", dann "alles OK". ggf. liegt der Knackus ja schon hier im Korn? Also in der Reihenfolge?

Meine Programmierkentnisse sind allgemein etwas eingerostet aber ich meine mich zu erinnern, dass mir ein Dozent sagte, dass es Problematisch sein kann wenn man den Fehlerfall zuerst behandelt bevor die allgemeine Auswertung erfolgt...
Eingefügtes Bild
0

#3 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 7.657
  • Beigetreten: 20. Juli 07
  • Reputation: 845

geschrieben 13. Mai 2017 - 12:18

Das Problem ist, daß nicht alles Funktion ist, was wie Funktion aussieht. Manches sind auch Sprachkonstrukte.

Kurzer Test sollte das überprüfen: array() oder foreach() oder sonstwas sperren und schauen, ob das einen Unterschied macht.

Wenn nicht, könntest Du ein zusätzliches Array aufmachen, wo diese builtins drinstehen, und die Testabfrage so anpassen, daß >Funktion okay, wenn Function_exists() ODER wenn array_exists($builtins, "funktionsname")< .
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#4 Mitglied ist online   Gispelmob 

  • Gruppe: aktive Mitglieder
  • Beiträge: 929
  • Beigetreten: 14. August 15
  • Reputation: 80

geschrieben 13. Mai 2017 - 12:38

Beitrag anzeigenZitat (Stefan_der_held: 13. Mai 2017 - 11:50)

Wieso machst du die Abfrage erst "Fehlerfall", dann "alles OK". ggf. liegt der Knackus ja schon hier im Korn? Also in der Reihenfolge?

Es ist schon richtig so. Bei If Else kann nur eines von beiden eintreten. In diesem Fall wird auf falsch geprüft "if (!function_exists..." und ansonsten wahr angenommen. Ich könnte hier maximal die Prüfung umdrehen und auf Verfügbarkeit prüfen.

Beitrag anzeigenZitat (RalphS: 13. Mai 2017 - 12:18)

Das Problem ist, daß nicht alles Funktion ist, was wie Funktion aussieht. Manches sind auch Sprachkonstrukte.

Das könnte es sein. Ich könnte auch, um das ganze zu kürzen, Dinge wie array weglassen. Denn sowas zu sperren macht nicht wirklich Sinn. Es ging mir aber um die grundsätzliche Frage warum man manches nicht prüfen kann. Bzw. nicht auf diesem Weg.
0

#5 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 4.156
  • Beigetreten: 11. September 10
  • Reputation: 191

geschrieben 13. Mai 2017 - 12:57

Prüft function_exists nicht nur das grundsätzliche Vorhandensein einer Funktion, egal ob dis- oder enabled? Und macht es überhaupt Sinn, prüfen zu wollen, ob Sachen funktionieren, die in der »Checkfunktion« verwendet werden? Also beispielsweise, wozu »foreach« auf das Funktionieren prüfen, wenn es in der Checkfunktion verwendet wird, die ja dann selbst gar nicht funktionieren würde, wenn foreach nicht ginge.
Ich bin ein sehr ordentlicher, fleißiger und reinlicher Mensch, nur leider gefangen im Körper eines schmuddeligen Faulpelzes … tja, kann man nix machen …
0

#6 Mitglied ist online   Gispelmob 

  • Gruppe: aktive Mitglieder
  • Beiträge: 929
  • Beigetreten: 14. August 15
  • Reputation: 80

geschrieben 13. Mai 2017 - 13:55

Beitrag anzeigenZitat (Holger_N: 13. Mai 2017 - 12:57)

Prüft function_exists nicht nur das grundsätzliche Vorhandensein einer Funktion, egal ob dis- oder enabled?

Nein, es wird geprüft ob die Funktion nicht definiert oder in der ini gesperrt ist. In dem Fall gibt es false. Der Name ist etwas irreführend, function_available wäre besser.

Beitrag anzeigenZitat (Holger_N: 13. Mai 2017 - 12:57)

Und macht es überhaupt Sinn, prüfen zu wollen, ob Sachen funktionieren, die in der »Checkfunktion« verwendet werden?

Nein, das ist klar. :)
0

#7 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 7.657
  • Beigetreten: 20. Juli 07
  • Reputation: 845

geschrieben 14. Mai 2017 - 00:13

Und das ist der Knicks, PHP verwendet nicht nur Funktionen, sondern auch andere Konstrukte.

array() ist keine Funktion. Es ist ein Konstrukt, oder genauer, ein Konstruktor für Arrays.

Zur Veranschaulichung: PHP versteht variable indirection für Variablen... und Funktionen... aber nicht für Konstrukte.

Entsprechend kann man sagen
 $fkt = 'printf';
 $fkt('%s%s', 'Ausgabe',"\n");



Gibt "Ausgabe" auf dem Bildschirm.

DAS funktioniert aber nicht:

$fkt = 'array';
$array = $fkt(0,1,2,3);

var_dump($array);



Stattdessen gibt es einen "call to undefined function array()"-Fehler.

Was Funktion ist und was nicht, gibts bei PHP in der Dokumentation nachzulesen.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#8 Mitglied ist online   Gispelmob 

  • Gruppe: aktive Mitglieder
  • Beiträge: 929
  • Beigetreten: 14. August 15
  • Reputation: 80

geschrieben 14. Mai 2017 - 05:58

Es geht mir bei der besagten Sub nicht darum zu unterscheiden was Funktion und was Kontrukt ist. Es geht darum zu prüfen, ob das was zur Funktion des Scriptes benötigt wird auf dem Server nicht gesperrt wurde.

Dabei kann es auch sein, dass ein Sprachkontrukt auf Sperrung getestet werden muss. Ich habe mittlerweile einfach Dinge wie array, if, else usw. rausgenommen, weil die Wahrscheinlichkeit dass dies gesperrt wurde ziemlich gering ist.

Bei include, include_once, require, require_once ist die Frage, wenn man das includen auf dem Server komplett sperrt, ob das trotzdem als nutzbar gilt, dann aber nur einen Fehler ausgibt. Diese Kontrukte kann ich edenfalls nicht mit function_exists testen. Da muss ich eine andere Lösung finden.

Dieser Beitrag wurde von Gispelmob bearbeitet: 14. Mai 2017 - 05:58

0

#9 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 7.657
  • Beigetreten: 20. Juli 07
  • Reputation: 845

geschrieben 14. Mai 2017 - 07:38

Nope. Es geht darum, daß Konstrukte nicht notwendigerweise Funktionen sind. Sperrt man Funktionen, bleiben die übrigen Konstrukte außen vor.

Wenn also Funktionen mittels disable_functions Direktive gesperrt werden, werden Nicht-Funktionen wie eben zum Beispiel echo, print oder array, if, while, foreach und so weiter und so weiter *nicht* gesperrt und können auch nicht gesperrt werden.

Dieser Beitrag wurde von RalphS bearbeitet: 14. Mai 2017 - 07:38

"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#10 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 4.156
  • Beigetreten: 11. September 10
  • Reputation: 191

geschrieben 14. Mai 2017 - 07:39

Also wenn ich gucken will, ob was Grundlegendes aktiviert oder deaktiviert ist, um meine Scripte anzupassen, nehme ich phpinfo();
Ich bin ein sehr ordentlicher, fleißiger und reinlicher Mensch, nur leider gefangen im Körper eines schmuddeligen Faulpelzes … tja, kann man nix machen …
0

#11 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 7.657
  • Beigetreten: 20. Juli 07
  • Reputation: 845

geschrieben 14. Mai 2017 - 07:48

... Das jetzt vielleicht nicht, aber php_ini_get('disable_functions') (hieß das glaub ich) sollte durchaus das richtige auswertbar zurückliefern.

Es ging mir halt nur drum, daß ein paar Teile von PHP nicht deaktivierbar sind.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#12 Mitglied ist online   Gispelmob 

  • Gruppe: aktive Mitglieder
  • Beiträge: 929
  • Beigetreten: 14. August 15
  • Reputation: 80

geschrieben 14. Mai 2017 - 10:09

Beitrag anzeigenZitat (Holger_N: 14. Mai 2017 - 07:39)

Also wenn ich gucken will, ob was Grundlegendes aktiviert oder deaktiviert ist, um meine Scripte anzupassen, nehme ich phpinfo();

Thema verfehlt. Ich will nicht gucken dass, sondern die Klasse muss wissen ob.

ini_get('disable_functions') klappt. Es zeigt die auf diesem Weg gesperrten Dinge an.

Dieser Beitrag wurde von Gispelmob bearbeitet: 14. Mai 2017 - 10:20

0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0