PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   PHP Developer Forum (https://www.php-resource.de/forum/php-developer-forum/)
-   -   Verständnissfrage zu "::" (https://www.php-resource.de/forum/php-developer-forum/89515-verstaendnissfrage-zu.html)

Poscht 16-01-2008 13:18

Verständnissfrage zu "::"
 
Hallo,

ich habe da mal eine Verständnissfrage zum ::-Operator.

Dazu eine kleine Beispiel-Klasse
PHP-Code:

class User
{
    private 
$_intUserID;

    public function 
__construct($intUserID)
    {
        
$this->_intUserID=(int)trim($intUserID);
    }

    public function 
isValidUser()
    {
        if(
$this->_intUserID>0)
        {
            
// weitere tests
        
}
    }


Diese kann ich nun ohne Probleme instanzieren und die Methode verwenden.
PHP-Code:

$u = new User(2);
$u->isValidUser(); 

Aber warum kann ich die Methode nicht direkt aufrufen? Also mit:
PHP-Code:

User::isValidUser(2); 

Der Parser bemängelt die Verwendung von $this in der Methode bei dieser Art des Aufrufes.
Wird beim Operator :: nicht die Klasse neu instanziert, der Konstruktor aufgerufen und somit auch die Verwendung von $this möglich?
Wo liegt mein (Denk)Fehler?

Fragt sich Poscht

jahlives 16-01-2008 13:24

Mit :: ohne new Klasse greifst du auf statische Methoden zu. Dazu muss aber die Methode und die ganze Klasse als static deklariert sein

unset 16-01-2008 13:31

IMHO muss lediglich die aufgerufene Methode static und public sein. Klassen an sich unterscheiden AFAIK gar nicht zwischen statisch und dynamisch. $this ist natürlich nicht möglich, da es sich auf das Instanzierte Objekt bezieht. In statischen Methoden/Klassen ist self zu benutzen: self::$meineVariable oder self::meineMethode().

Poscht 16-01-2008 13:38

Ok, das war der entscheidende Hinweis. ;)

Auszug aus dem PHP-Handbuch zu static.
"Weil statische Methoden ohne die Instanz eines erzeugten Objektes aufrufbar sind, ist die Pseudovariable $this nicht innerhalb von der als statisch deklarierten Methode verfügbar."

Damit ist auch klar, warum mein Aufruf nicht geht.

Danke für die Antworten!

stekoe2000 16-01-2008 13:55

http://www.peterkropff.de/site/php/statisches.htm << Hier kannst du das auch nochmal gut nachlesen!

combie 16-01-2008 16:33

Weils so schön dazu passt:
PHP 5.3 wird uns u.a. mit einer Neuerung erfreuen
Es gibt dann nicht nur: self:: und parent:: sondern auch löblicherweise static:: ! Zu allem Überfluss schenken sie uns dann auch noch: get_called_class(). Damit lässt sich dann sogar das Singleton Verhalten recht sauber vererben.

PHP-Desaster 16-01-2008 19:25

Zitat:

Damit lässt sich dann sogar das Singleton Verhalten recht sauber vererben.
Wenn die diesen Käse auch noch beheben, ja ;)

combie 16-01-2008 19:44

Ja, das kommt noch....
:D hoffendlich :D
PHP-Code:

<?php 
// only php >= 5.3
error_reporting(E_ALL); 
ini_set('display_errors'TRUE); // evtl. hilfreich 



abstract class singleton 

    private static 
$instances= array(); 
     
    final public static function 
getInstance() 
    { 
      
$class get_called_class(); 
      if(empty(
self::$instances[$class])) 
        
self::$instances[$class] = new $class
      return 
self::$instances[$class]; 
    } 

    
/* final */ protected function __construct(){} 
    final private function 
__clone(){} 



class 
mytest extends singleton 




$my mytest::getInstance(); 

echo 
get_class($my); 
?>

Mit etwas Nacharbeit bekommt man evtl. so gar noch die Konstruktoren mit Parameter zum "funzen"....
Aber darum solls hier nicht gehen.

ministry 17-01-2008 15:51

Zitat:

Original geschrieben von unset
IMHO muss lediglich die aufgerufene Methode static und public sein. Klassen an sich unterscheiden AFAIK gar nicht zwischen statisch und dynamisch. $this ist natürlich nicht möglich, da es sich auf das Instanzierte Objekt bezieht. In statischen Methoden/Klassen ist self zu benutzen: self::$meineVariable oder self::meineMethode().
Man kann auch nicht-statische Methoden statisch benutzen, sofern kein $this drin vorkommt. Es gibt dann lediglich eine Meldung auf Strict-Standards-Level (würde von error_reporting(E_ALL) nichtmal angezeigt werden):

PHP-Code:

class test {
    public function 
statictest() {
        echo(
"geht");
    }
}
    
$test = new test();
    
$test->statictest();
echo(
"<br />");
test::statictest(); 


combie 17-01-2008 16:30

Zitat:

sofern kein $this drin vorkommt.
Leider auch nicht richtig!!


Deinen abwegigen Gedanken weitergedacht, wäre durchaus sowas einsetzbar:
PHP-Code:

class blabla
{
  function 
dadu($pfad)  // public 
  

    if (!isset(
$this)) 
    { 
// statischen Aufruf ermoeglichen 
      
$selbst __CLASS__ 
      
$child = @ new $selbst  
      return 
$child->dadu($pfad); 
    }
    
// tuwas mit $this
  
}


Aber, ist doch doof, oder nicht??

ministry 18-01-2008 13:42

Zitat:

Aber, ist doch doof, oder nicht??
Auf jeden Fall ziemlich merkwürdig...


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:47 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG