Quelle est la différence entre: (Double colon) et -> (flèche) en PHP?

il y a deux façons distinctes d'accéder aux méthodes en PHP, mais quelle est la différence?

$response->setParameter('foo', 'bar');

et

sfConfig::set('foo', 'bar');

je suppose que -> (tiret plus grand que signe ou chevron) est utilisé pour les fonctions pour les variables, et :: (doubles colons) est utilisé pour les fonctions pour les classes. - Il Correct?

est-ce que l'opérateur de cession => n'est utilisé que pour assigner des données dans un tableau? Est-ce une revanche à l'opérateur d'affectation = qui est utilisé pour instancier ou modifier une variable?

167
php
demandé sur tereško 2010-07-04 06:17:36

6 réponses

lorsque la partie gauche est une instance objet, vous utilisez -> . Sinon, vous utilisez :: .

cela signifie que -> est principalement utilisé pour accéder aux membres d'instance (bien qu'il puisse également être utilisé pour accéder aux membres statiques, une telle utilisation est découragée), tandis que :: est habituellement utilisé pour accéder aux membres statiques (bien que dans quelques cas spéciaux, il est utilisé pour accéder aux membres d'instance).

En général, :: est utilisé pour scope resolution , et il peut avoir soit un nom de classe, parent , self , ou (en PHP 5.3) static à sa gauche. parent renvoie à la portée de la superclasse de la classe dans laquelle elle est utilisée; self renvoie à la portée de la classe dans laquelle elle est utilisée; static renvoie à la" portée appelée "(voir fixations statiques tardives ).

la règle est qu'un appel avec :: est un appel d'instance si et seulement si:

  • la méthode cible n'est pas déclarée comme statique et
  • il existe un contexte objet compatible au moment de l'appel, ce qui signifie qu'il doit être vrai:
    1. l'appel est fait à partir d'un contexte où $this existe et
    2. la classe des $this est soit la classe de l'appel d'une méthode ou d'une sous-classe.

exemple:

class A {
    public function func_instance() {
        echo "in ", __METHOD__, "\n";
    }
    public function callDynamic() {
        echo "in ", __METHOD__, "\n";
        B::dyn();
    }

}

class B extends A {
    public static $prop_static = 'B::$prop_static value';
    public $prop_instance = 'B::$prop_instance value';

    public function func_instance() {
        echo "in ", __METHOD__, "\n";
        /* this is one exception where :: is required to access an
         * instance member.
         * The super implementation of func_instance is being
         * accessed here */
        parent::func_instance();
        A::func_instance(); //same as the statement above
    }

    public static function func_static() {
        echo "in ", __METHOD__, "\n";
    }

    public function __call($name, $arguments) {
        echo "in dynamic $name (__call)", "\n";
    }

    public static function __callStatic($name, $arguments) {
        echo "in dynamic $name (__callStatic)", "\n";
    }

}

echo 'B::$prop_static: ', B::$prop_static, "\n";
echo 'B::func_static(): ', B::func_static(), "\n";
$a = new A;
$b = new B;
echo '$b->prop_instance: ', $b->prop_instance, "\n";
//not recommended (static method called as instance method):
echo '$b->func_static(): ', $b->func_static(), "\n";

echo '$b->func_instance():', "\n", $b->func_instance(), "\n";

/* This is more tricky
 * in the first case, a static call is made because $this is an
 * instance of A, so B::dyn() is a method of an incompatible class
 */
echo '$a->dyn():', "\n", $a->callDynamic(), "\n";
/* in this case, an instance call is made because $this is an
 * instance of B (despite the fact we are in a method of A), so
 * B::dyn() is a method of a compatible class (namely, it's the
 * same class as the object's)
 */
echo '$b->dyn():', "\n", $b->callDynamic(), "\n";

sortie:

B::$prop_static: B::$prop_static value
B::func_static(): in B::func_static

$b->prop_instance: B::$prop_instance value
$b->func_static(): in B::func_static

$b->func_instance():
in B::func_instance
in A::func_instance
in A::func_instance

$a->dyn():
in A::callDynamic
in dynamic dyn (__callStatic)

$b->dyn():
in A::callDynamic
in dynamic dyn (__call)
152
répondu Artefacto 2014-06-30 17:37:24

:: est utilisé dans les statique "151980920 de contexte", c'est à dire. lorsqu'une méthode ou une propriété est déclarée comme statique:

class Math {
    public static function sin($angle) {
        return ...;
    }
}

$result = Math::sin(123);

aussi, l'opérateur :: (L'opérateur de résolution de portée, A. K. a Paamayim Nekudotayim ) est utilisé dans le contexte dynamique lorsque vous invoquez une méthode / propriété d'une classe mère:

class Rectangle {
     protected $x, $y;

     public function __construct($x, $y) {
         $this->x = $x;
         $this->y = $y;
     }
}

class Square extends Rectangle {
    public function __construct($x) {
        parent::__construct($x, $x);
    }
}

-> est utilisé dans les dynamique "151980920 de contexte", c'est à dire. lorsque vous avez affaire à une instance d'une certaine classe:

class Hello {
    public function say() {
       echo 'hello!';
    }
}

$h = new Hello();
$h->say();

soit dit en passant: je ne pense pas que L'utilisation de Symfony soit une bonne idée quand vous n'avez aucune expérience OOP.

38
répondu Crozin 2015-04-22 03:25:02

en fait par ce symbole nous pouvons appeler une méthode de classe qui est statique et ne dépend pas d'autres initialisations...

class Test {

    public $name;

    public function __construct() {
        $this->name = 'Mrinmoy Ghoshal';
    }

    public static function doWrite($name) {
        print 'Hello '.$name;
    }

    public function write() {
        print $this->name;
    }
}

ici la fonction doWrite () n'est dépendante d'aucune autre méthode ou variable, et c'est une méthode statique. C'est pourquoi nous pouvons appeler cette méthode par cet opérateur sans initialiser l'objet de cette classe.

Test::doWrite('Mrinmoy'); // Output: Hello Mrinmoy.

mais si vous voulez appeler la méthode write dans ce façon, il génère une erreur, car il dépend de l'initialisation.

19
répondu Mrinmoy Ghoshal 2015-12-21 09:40:36

l'opérateur => est utilisé pour assigner des paires de valeurs clés dans un tableau associatif. Par exemple:

$fruits = array(
  'Apple'  => 'Red',
  'Banana' => 'Yellow'
);

son sens est similaire à celui de l'énoncé foreach :

foreach ($fruits as $fruit => $color)
  echo "$fruit is $color in color.";
14
répondu casablanca 2010-07-04 02:28:04

la différence entre les méthodes statiques et instanciées et les propriétés semblent être l'un des plus grands obstacles pour ceux qui viennent de commencer avec OOP PHP en PHP 5.

l'opérateur à double côlon (appelé Paamayim Nekudotayim de Hébreu - trivia) est utilisé pour appeler un objet ou une propriété à partir d'un contexte statique . Cela signifie une instance de l'objet n'a pas encore été créé.

l'opérateur arrow, inversement, les méthodes d'appels ou les propriétés que d'une référence d'une instance de l'objet.

les méthodes statiques peuvent être particulièrement utiles dans les modèles d'objets qui sont liés à une base de données pour créer et supprimer des méthodes, puisque vous pouvez définir la valeur de retour à l'id de table inséré et ensuite utiliser le constructeur pour instancier l'objet par l'id de ligne.

12
répondu DeaconDesperado 2010-07-06 20:12:14

Oui, je viens de frapper mon premier 'PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM' . Ma faute, j'ai eu un $instance::method() qui aurait dû être $instance->method() . Je suis bête.

la chose étrange est que cela fonctionne encore très bien sur ma machine locale (exécutant PHP 5.3.8) - rien, pas même un avertissement avec error_reporting = E_ALL - mais pas du tout sur le serveur de test, il explose juste avec une erreur de syntaxe et un écran blanc dans le navigateur. Depuis PHP logging a été éteint à la machine de test, et l'hébergement la compagnie était trop occupée pour l'allumer, ce n'était pas trop évident.

donc, mot de mise en garde: apparemment, certaines installations PHP vous permettront d'utiliser une instance$:: method(), tandis que d'autres non.

si quelqu'un peut expliquer pourquoi, s'il vous plaît.

2
répondu PapaFreud 2012-03-07 09:41:45