• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Sting nur in bestimmten arailen durchsuchen

Nightmare

Neues Mitglied
Hi an alle,

Habe ein kleines Problem und weis nicht mehr weiter. Google wollte mir auch nicht so recht Antwort stehen. Ich will eine Datei nach Funktionsnamen durchsuchen, bevor ich sie einbinden lasse, um eine doppelte Funktionsdeklaration zu vermeiden. Hierbei soll der aus einer Datei gelesene String nicht innerhalb der Funktion suchen.

PHP:
 function irgendwas(){
return irgendeine_andere_Funktion();}
wenn ich jetzt jedoch die Datei mit strpos(); und einem Array, bereits eingebundener Funktionen durchsuche, bindet er die Datei nicht mit ein, weil vorher schon die Funktion "irgendeine_andere_Funktion();" deklariert wurde. Das bedeutet, er darf den String nicht innerhalb der {} Klammern durchsuchen, vielleicht weis ja jemand eine Lösung,

aber Danke schon einmal im vorhinein.
 
schreib um deine funktionen doch einfach volgendes rum um doppelte deklarationen zu vermeiden...

PHP:
// der gemeine weg prüfen ob die funktion existiert und wenn dann überschreiben
if(function_exists('name_der_funktion')) {
    override_function(
        'name_der_funktion',
        '$param1, $param2',
        '$param1 = $param1 ^ $param2; return $param2 ^ $param1;'
    );
// und wenn nicht dann normal erstellen ^^
} else {
    function name_der_funktion($param1, $param2) {
        $param1 = $param1 ^ $param2;
        return $param2 ^ $paarm1;
    }
}

// der normale weg,
// prüfen ob die funktion deklariert ist und wenn nicht eigene nehmen sonst vorhandene
if(!function_exists('name_der_funktion')) {
    function name_der_funktion($param1, $param2) {
        $param1 = $param1 ^ $param2;
        return $param2 ^ $paarm1;
    }
}
 
Deine Idee ist definitiv nicht schlecht. Ich arbeite zurzeit an einem Projekt, in das der User seine eigenen Funktionsbibliotheken einbinden kann. Das heist, ich weis absolut nicht, wie der Anwender am ende seine Funktionssammlung anlegt. Und um eine "Massenkarambulasche" mit meinen Funktionen zu vermeiden muss ich irgendwie vor dem einbinden jeder Funktionsdatenbank überprüfen, ob es knallt.

Habe aber schon eine Idee, wenn jemand auch eine hat, soll er sie ruig Posten. Meine Idee werde ich auch hier rein setzen, wenn ich sie geprüft habe.
 
du fängst einfach die exceptions ab die geworfen werden wenn versucht wird die funktion zu überschreiben und fertig ^^
 
erklähr mir das mal mit den exceptions, das klingt irgendwie gut. Auserdem will ich das verzeichniss mit den Daten nicht mit diesem Script durchlaufen:

PHP:
         $checkfile="testlib.php";

    //Existierende Funktionen holen
         $arr = get_defined_functions();
         //Datei Auslesen
    $handle = fopen ($checkfile, "r");
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);
        $data = "$data$buffer";}
    fclose ($handle);
    //Funktionen offen legen
         $data  = explode("function", $data);
         $i=0;
         foreach($data as $dat){
         $end=strpos($dat,"(");
         $fi[$i]=str_replace(' ','',substr($dat, 0, $end));$i++;};
         //Funktionen vergleichen
         $result  = array_intersect($fi, $arr["user"]);
         $result2 = array_intersect($fi, $arr["internal"]);
         $array = array_merge($result, $result2);

         //Fehlermeldung oder Inhalt
         if(count($array) > 0){
         $error .= "Folgende Funktionen sind Doppelt:<br>";
             foreach($array as $are){$error .= "$are<br>";}
         }else{include("$checkfile");}



    echo $error;
 
also was mit den exceptions geht nciht da war ich gerade n bissel blöd, aber die dateien nach strings zu durchsuchen ist viel zu aufwändig.

ich würde es so machen...

dem user sage ich das er wenn er eine funktion baut direkt darüber meine funktion aufrufen soll und als parameter den namen der funktion als string. deine funktion sieht dann so aus

PHP:
function functionCheck($name) {
    if(function_exists($name)) {
        throw new Exception('Please don` t redeclare functions!');
    }
}

und der user scheribt dann wenn er ne funktion baut einfach

PHP:
functionCheck('test');

function test($bla) {
    // mach was ^^
}

aber du könntest auch einfach versuchen OOP zu lernen damit wirst du schneller mehr erfolg haben bei solchen aufgaben da du da magische methoden hast und den ablauf viel detallierter beeinflussen kannst (weils übersichtlicher ist^^)
 
Meinst du mit oop Objektorientiertes Programmieren? Ist das denn mit PHP Möglich oder muss ich mir da noch irgendwas auf den Webserver laden?

Wenn oop mit php möglich ist, könntest du mir ja mal ein Tutorial empfelen^^
 
Verhindert man doppelte Funktionsdeklarationen nicht einfach mit include_once()?
 
Verhindert man doppelte Funktionsdeklarationen nicht einfach mit include_once()?
?!? Damit verhinderst du nur das mehrfache einbinden, einer Datei Ob ich eine Funktion XY geschrieben habe, der Anwender oder xy schon in php dabei ist interessiert Include_once keinen einzigen Meter...

Du kannst jaauch in drei vollkommen unterschiedlichen Dateien die Funktion xy deklarieren und das findet PHP garnicht lustig.

@Slibbo Vielen dank für die Links, bin schon fleisig am Lesen^^
 
Aber warum sollte ich in unterschiedlichen Dateien die selbe Funktion deklarieren?
 
OKay, die Datei explorer_lib.php deklariert eine Funktion namens dirrecsize($dir) damit der Dateiexplorer die größe von Unterordnern berechnen kann. Jetzt ist die Datei filelib.php (ein funktionsscript aus einem anderen CMS) ebenfalls in der lage mit dirrecsize($dir) einen Ornder auf seine größe zu überprüfen, und schon knallt es.

Es geht hier nicht darum das jemand absichtlich eine Funktion deklariert, sondern aus unwissenheit. Das CMS bringt mehr als 50 eigene Funktionen mit, und ich bezweifel wirklich, das jeder Benutzer sich alle 50 (für ihn fremde) Funktionen anguckt und dann erst seine eigene Funktion schreibt.

Ich meine, normalerweise müsste er das tun, um nicht eine Funktion zu schreiben die es schon gibt und sie unter einem anderen Namen zu speichern. Aber man geht doch lieber von der unwissenheit anderer Menschen aus...
 
das macht keinen sinn,

warum sollte jemand funktionen deklarieren ?


schreibe ein kleine modul/plugin api

der user schreibt ein plugin:

my_plugin extends APIPlugin

über ein interface verlangst du ihm diverse methoden ab.

mit pluginMonitor->add($instanceOfMyModule); wird das plugin "hinzugefügt" und steht dienem system zur verfügung.


blinde funktionen zu deklarieren macht keinen sinn.

PHP Patterns: The Composite Pattern
 
hi, um eine datei nach funktionsnamen zu durchsuchen kannst du reguläre ausdrücken verwenden:

PHP:
$content = file_get_contents('func.php');

$reg_exp = '/function {1,}([a-z0-9_]*) {0,}\(.*?\)/is';
preg_match_all($reg_exp, $content, $matches, PREG_SET_ORDER);

print_r($matches);

foreach ($matches as $match) {
  echo '<p>' . $match[1] . '</p>';
}
 
wiegesagt, völlig falsche herangehensweise

das sollte nicht weiter dein problem sein, wenn er es gerne so hätte. lass ihn doch selbst herausfinden ob das sinn macht!

das macht keinen sinn,

warum sollte jemand funktionen deklarieren ?
das ist kein argument, da könnt ich dich fragen: "warum nicht?"
warum er so eine funktion seinen usern anbieten möchte, kann er dir sicher am besten erklären
 
das ist kein argument, da könnt ich dich fragen: "warum nicht?"
warum er so eine funktion seinen usern anbieten möchte, kann er dir sicher am besten erklären

Die Antwort darauf ist ziemlich einfach, ich arbeite zurzeit (aus Fun) an einem WebCMS in das man Plugins über Zip einbinden kann. Das Bedeutet, das man seine eigenen Plugins schreiben kann, wenn man das CMS benutzt. Und falls jemand Lust hat dafür z.B. ein großes Gästebuch zu schreiben, kann er seine eigenen Funktionen schreiben und einbinden. Damit sich das nicht mit den (für das CMS deklarierten Funktionen) beist, will ich ein Kontrollscript schreiben, was dann sagt Datei xy konnte nicht eingebunden werden da die Funktion xy bereits vergeben ist. Denn das Ziel ist es mit error_reporting(0); zu arbeiten. Und dann wird ja auch nicht mehr:
PHP:
Fatal error:  Cannot redeclare xy
angezeigt.

Die Idee von Asipak4You gefällt mir. Die Sache mit oop zu lösen wurde ja schon angesprochen, habe mich auch schon darin eingelesen, aber noch nicht viele Erfahrungen damit gesammelt, und dem zufolge auch noch nicht so sehr den Überblick.
 
Zuletzt bearbeitet:
Zurück
Oben