15

I am looking through some php code and I see this "::" notation that i have no idea what it means...also what the & in the front of the call

$mainframe =& JFactory::getApplication('site');
$sql="SELECT rt.member_id ,rt.commission,rt.sales,kt.store_id,kt.user_id FROM jos_report
rt JOIN jos_kingdom_tickets kt WHERE rt.member_id=kt.ticket_id";
$db =& JFactory::getDBO();

thanks in advance

HoldOffHunger
  • 18,769
  • 10
  • 104
  • 133
Matt Elhotiby
  • 43,028
  • 85
  • 218
  • 321

4 Answers4

28

::, the scope resolution operator, is used for referencing static members and constants of a class. It is also used to reference a superclass's constructor. Here is some code illustrating several different uses of the scope resolution operator:

<?php
class A {
    const BAR = 1;
    public static $foo = 2;
    private $silly;

    public function __construct() {
         $this->silly = self::BAR;
    }
}

class B extends A {
    public function __construct() {
        parent::__construct();
    }

    public static function getStuff() {
         return 'this is tiring stuff.';
    }
}

echo A::BAR;
echo A::$foo;
echo B::getStuff();
?>

A little trivia: The scope resolution operator is also called "paamayim nekudotayim", which means "two dots twice" in hebrew.

& in the context of your example isn't doing anything useful if you are using php 5 or greater and should be removed. In php 4, this used to be necessary in order to make sure a copy of the returned object wasn't being used. In php 5 object copies are not created unless clone is called. And so & is not needed. There is still one case where & is still useful in php 5: When you are iterating over the elements of an array and modifying the values, you must use the & operator to affect the elements of the array.

Asaph
  • 159,146
  • 25
  • 197
  • 199
4

You can use it to reference static methods from a class without having to instantiate it.

For example:

class myClass {

    public static function staticFunction(){
        //...
    }

    public function otherFunction(){
        //...
    }

}

Here you could use myClass::staticFunction() outside of the class, but you would have to create a new myClass object before using otherFunction() in the same way.

Eric Yang
  • 1,881
  • 1
  • 18
  • 23
3

:: is the scope operator in PHP, c++, but not in Java. In this case, it is used to call a static method of a class. A static method is a method which can be called from outside the class, even when you don't have an instance of it.

& indicates that rather than making a copy of what the function returns, it takes the reference to the object returned. In this case, they seem to return singleton objects which are used in the application, e.g. to interface with the database (in the second case)

Cronco
  • 590
  • 6
  • 18
1

It's the scope operator, used for referencing constants or static methods under classes. So:

class C {
    const D = 2;
}

echo C::D; // 2

In your case, it calls a method of the class not tied to a particular instance.

Ry-
  • 218,210
  • 55
  • 464
  • 476