oophp、方法和属性命名

oophp、方法和属性命名,php,oop,naming-conventions,Php,Oop,Naming Conventions,在php中,使用 $myClass::method() 及 改变的原因是什么?(我相信->已经存在很久了。) 我可以看出使用:方法和->属性的意义,反之亦然。:是范围解析操作符,用于访问类的静态成员 ->是成员运算符,用于访问对象的成员 下面是一个例子: class Car { public $mileage, $current_speed, $make, $model, $year; public function getCarInformation() { $out

在php中,使用

$myClass::method()

改变的原因是什么?(我相信
->
已经存在很久了。)


我可以看出使用
方法和
->
属性的意义,反之亦然。

是范围解析操作符,用于访问类的
静态成员

->
是成员运算符,用于访问对象的成员

下面是一个例子:

class Car {
   public $mileage, $current_speed, $make, $model, $year;
   public function getCarInformation() {
      $output = 'Mileage: ' . $this->mileage;
      $output = 'Speed: ' . $this->current_speed;
      $output = 'Make: ' . $this->make;
      $output = 'Model: ' . $this->model;
      $output = 'Year: ' . $this->year;
      return $output; 
   }
}

class CarFactory {

    private static $numberOfCars = 0;

    public static function carCount() {
       return self::$numberOfCars;    
    }

    public static function createCar() {
       self::$numberOfCars++; 
       return new Car();
    }

}    

echo CarFactory::carCount(); //0

$car = CarFactory::createCar();

echo CarFactory::carCount(); //1

$car->year = 2010;
$car->mileage = 0;
$car->model = "Corvette";
$car->make = "Chevrolet";

echo $car->getCarInformation();

也用于类/对象中调用其父对象,例如:

parent::__constructor();
如果它是从对象内部调用的(因此不是静态调用)。

请考虑以下问题:

class testClass {
    var $test = 'test';
    
    function method() {
        echo $this->test;
    }
}

$test = new testClass();

$test->method();
testClass::method();
输出类似于:

试验

致命错误:不在中的对象上下文中使用$this。。。在线7

这是因为
::
对类进行静态调用,而
->
用于调用类的特定实例上的方法或属性

顺便说一句,我不相信你能做
$test::method()
,因为PHP会给你这样一个解析错误:

分析错误:语法错误,在。。。第14行


也可以在这里看到:PHP称之为Paamayim Nekudotayim,这是非常自然的=)啊,谢谢。现在,有一个很好的理由来处理静态类?@user247245:static
关键字只对类变量是必需的。对于方法,您可以跳过
静态
公共
,因为它们只会少量更改语义。静态类本身对分组方法(=穷人的命名空间)最有意义从PHP5.3开始工作。(与大多数共享主机服务器无关。)@mario谢谢你的提示。我在ideone.com上试过这个,这就是我出错的原因。
class testClass {
    var $test = 'test';
    
    function method() {
        echo $this->test;
    }
}

$test = new testClass();

$test->method();
testClass::method();