Lo siguiente es válido para PHP 4 y posteriores únicamente.
Algunas veces es útil hacer referencia a funciones y variables en las clases base o hacer referencia a funciones que se encuentran en clases que aún no tienen ninguna instancia. El operador :: es utilizado para realizar esto.
<?php
class A {
function example() {
echo "I am the original function A::example().<br />\n";
}
}
class B extends A {
function example() {
echo "I am the redefined function B::example().<br />\n";
A::example();
}
}
// no hay objetos de la clase A.
// esto imprimirá
// I am the original function A::example().<br />
A::example();
// crear un objeto de clase B.
$b = new B;
// esto imprimirá
// I am the redefined function B::example().<br />
// I am the original function A::example().<br />
$b->example();
?>
El ejemplo de arriba invoca a la función example() en la clase A, pero no hay un objeto de la clase A, así que no es posible escribir $a->example() o algo semejante. En vez de ello se invoca example() como una 'función de clase', es decir, como una función de la clase misma, no de un objeto de esa clase.
Existen funciones de clase, pero no existen variables de clase. De hecho, no existe objeto alguno en el momento de la invocación. Siendo así, una función de clase no puede utilizar ninguna variable de objeto (pero puede utilizar variables locales y globales), y no puede utilizar $this para nada.
En el ejemplo anterior, la clase B vuelve a definir la función example(). La definición original en la clase A queda desplazada y ya no se encuentra disponible, a menos que se haga referencia específicamente a la implementación de example() en la clase A empleando el operador ::. Se escribe A::example() para realizar esto (de hecho, se debe escribir parent::example(), tal como se muestra en la siguiente sección).
En este contexto, existe un objeto actual y puede tener variables de objeto. Así, cuando se usen desde el INTERIOR de una función de objeto, se puede utilizar $this y las variables de objeto.