phpbar.de logo

Mailinglisten-Archive

[php] Methode lieber statisch oder nicht

[php] Methode lieber statisch oder nicht

Yannik Hampe yannik at cipher-code.de
Don Sep 13 15:04:26 CEST 2007



Steffen Kother wrote:
> Hallo Leute,
> 
> Habe gerade mal mit PHPEdit v2.12.2.5164 mein simples 5er Testskript
> "enkäfert". Hier erstmal das Skript als solches:
> 
> <?php
> require_once 'library/common.class.inc.php5';
> 
> $test =& single('common');
> $test -> reqClasses('mysql');
> 
> $result = $test -> mysql -> fetchAll(mysql::query('SELECT * FROM
> sap_data.kna1 ORDER BY KUNNR ASC'));
> 
> echo '<pre>';
> print_r($test);
> echo '</pre>';
> ?>
> 
> Funzt wie gewünscht. Error-Reporting steht auf E_ALL. Mich stört jetzt
> nur noch die E_STRICT- Meldung "Non-static method mysql::query() should
> not be called statically". Ohne "static"-Zusatz in der Definition der
> Methode läuft das Skript relativ schnell durch. Schreibe ich aber
> "static" mit rein, dann benötigt das Skript im Verhältnis dazu ewig.
> Hier mal der unstatische Code der Methode:
> 
>     public function query ($query = NULL, $link = NULL) {
>         if (empty($this)) {
>             $mysql = new mysql();
>             return $mysql -> query($query, $link);
>         }
> 
>         if (NULL === $query) {
>             return false;
>         }
> 
>         $link = $this -> checkResource('get_mysql_connect', $link);
> 
>         $resource = @mysql_query($query, $link);
>         $resource = $this -> checkResource('set_mysql_query',
> $resource);
>         return $resource;
>     }

Ja... was soll ich dazu sagen mhh...
Sagen wir mal vorsichtig: Ich glaube ausser in php hast du noch nicht 
"richtig" OOP programmiert.
Eine static Methode ist eine normale Funktion mit Klassenzugehörigkeit. 
Sie hat kein $this. Mit anderen Worten: Dein if (empty(this)) ist IMMER 
true. Damit bleibst du in einer Endlosrekursion stecken (Obwohl ich das 
jetzt nicht getested habe udn du nur schreibst, das es im Vergleich 
lange dauert aber schon funktionier...?).

Wenn du sowas static machen willst, was durchaus sinnvoll ist, dann 
solltest du das so machen:
class bla
{
   private static $connection;
   private static getConnection()
   {
     if (self::$connection ===null) self::$connection =mysql_connect(..);
     return self::$connection;
   }
   public static query(..)
   {
     $c =self::getConnection();
     mysql_query(.., $c);
   }
}
Wenn du multithreading hättest (also nicht in php, ich meine jetzt nur 
mal so von der OOP-Theorie her) müsstest du dann nurnoch getConnection 
vor gleichzeitigem Zugriff schützen und schön wäre die Klasse Threadfähig.

modern würde man das natürlich auch besser mit pdo machen als mit mysql_*...

> 
> Besten Dank

Yannik

php::bar PHP Wiki   -   Listenarchive