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 offline   Gispelmob 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.591
  • Beigetreten: 14. August 15
  • Reputation: 392

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

AMD Ryzen 9 5950X, Asus ROG Strix X570-F Gaming, 32GB Corsair DDR4-3200, Asus Geforce GTX 3060 12GB, Creative Sound Blaster AE-7, 240GB SSD, 500GB SSD, 3x 1TB SSD, Win11 Home, 4x Acer G246HL Bbid, Logitech MX518 Gaming Mouse, Logitech G440 Mousepad, Logitech K120 Keyboard, Razer Tiamat 7.1 V2 Headset, Creative Inspire 5.1 5300 Soundsystem
0

Anzeige



#2 Mitglied ist offline   Stefan_der_held 

  • Gruppe: Offizieller Support
  • Beiträge: 14.289
  • Beigetreten: 08. April 06
  • Reputation: 885
  • Geschlecht:Männlich
  • Wohnort:Dortmund NRW
  • Interessen:Alles wo irgendwie Strom durchfließt fasziniert mich einfach weswegen ich halt Elektroinstallateur geworden bin :)

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...
0

#3 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

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 offline   Gispelmob 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.591
  • Beigetreten: 14. August 15
  • Reputation: 392

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.
AMD Ryzen 9 5950X, Asus ROG Strix X570-F Gaming, 32GB Corsair DDR4-3200, Asus Geforce GTX 3060 12GB, Creative Sound Blaster AE-7, 240GB SSD, 500GB SSD, 3x 1TB SSD, Win11 Home, 4x Acer G246HL Bbid, Logitech MX518 Gaming Mouse, Logitech G440 Mousepad, Logitech K120 Keyboard, Razer Tiamat 7.1 V2 Headset, Creative Inspire 5.1 5300 Soundsystem
0

#5 Mitglied ist offline   Holger_N 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

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.
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#6 Mitglied ist offline   Gispelmob 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.591
  • Beigetreten: 14. August 15
  • Reputation: 392

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. :)
AMD Ryzen 9 5950X, Asus ROG Strix X570-F Gaming, 32GB Corsair DDR4-3200, Asus Geforce GTX 3060 12GB, Creative Sound Blaster AE-7, 240GB SSD, 500GB SSD, 3x 1TB SSD, Win11 Home, 4x Acer G246HL Bbid, Logitech MX518 Gaming Mouse, Logitech G440 Mousepad, Logitech K120 Keyboard, Razer Tiamat 7.1 V2 Headset, Creative Inspire 5.1 5300 Soundsystem
0

#7 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

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 offline   Gispelmob 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.591
  • Beigetreten: 14. August 15
  • Reputation: 392

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

AMD Ryzen 9 5950X, Asus ROG Strix X570-F Gaming, 32GB Corsair DDR4-3200, Asus Geforce GTX 3060 12GB, Creative Sound Blaster AE-7, 240GB SSD, 500GB SSD, 3x 1TB SSD, Win11 Home, 4x Acer G246HL Bbid, Logitech MX518 Gaming Mouse, Logitech G440 Mousepad, Logitech K120 Keyboard, Razer Tiamat 7.1 V2 Headset, Creative Inspire 5.1 5300 Soundsystem
0

#9 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

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: 5.111
  • Beigetreten: 11. September 10
  • Reputation: 458
  • Geschlecht:Männlich

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();
Bauernregel: Regnets mächtig im April, passiert irgendwas, was sich auf April reimt.
0

#11 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

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 offline   Gispelmob 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.591
  • Beigetreten: 14. August 15
  • Reputation: 392

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

AMD Ryzen 9 5950X, Asus ROG Strix X570-F Gaming, 32GB Corsair DDR4-3200, Asus Geforce GTX 3060 12GB, Creative Sound Blaster AE-7, 240GB SSD, 500GB SSD, 3x 1TB SSD, Win11 Home, 4x Acer G246HL Bbid, Logitech MX518 Gaming Mouse, Logitech G440 Mousepad, Logitech K120 Keyboard, Razer Tiamat 7.1 V2 Headset, Creative Inspire 5.1 5300 Soundsystem
0

Thema verteilen:


Seite 1 von 1

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