2011-05-20 111 views
3

我想知道这两种方法之间的差异用于初始化类这两种初始化PHP类的方法有什么区别?

方法1(使用范围解析运算符)的对象:

Test::foo(); 

方法2(创建对象的实例) :

$test = new Test; 
$test->foo(); 

这是什么->运算符叫?

+0

[PHP中 - >和::之间有什么区别?](http://stackoverflow.com/questions/1804187/what-is-the-difference-between-and-in-php) – 2011-05-20 06:51:27

回答

8

Test::foo()只是静态调用一个类的方法,它不会对对象做任何事情。它可能会初始化类中的静态值,但通常不使用静态初始值设定项。在Singletons的情况下,可以在内部使用静态初始化程序,但不应该像这样调用公共静态初始化程序。

$test = new Test实际上实例一个对象,在该方法中有可能初始化

请注意区别之间初始化(设置对象/类/变量的初始状态),并且的instantiate(创建从一个类对象实例)。

->T_OBJECT_OPERATOR

+0

可能重复除此之外,如果你正在处理一个单例,你通常会使用静态初始化器。 – mekwall 2011-05-20 06:53:47

+0

@Marcus什么是单身人士? – 2011-05-20 06:55:12

+1

@Ibrahim,一个单身人士在任何时候都只能有一个类的单个实例。你可以阅读更多关于它[这里](http://php.net/manual/en/language.oop5.patterns.php) – mekwall 2011-05-20 06:58:08

2

::被称为 “Paamayim Nekudotayim”(它的希伯来文),->是对象操作:

http://www.php.net/manual/en/language.oop5.paamayim-nekudotayim.php

也不应该被用来初始化类。有一个神奇的__construct()方法是,它是由new操作自动调用:

http://php.net/manual/en/language.oop5.decon.php

Test::foo()意味着调用方法foo()静态,实际对象的范围之外。把它看作某种(慢)名称空间函数。

$test->foo()表示对象$ test的调用方法foo()

http://www.php.net/manual/en/language.oop5.static.php

-1

我把它叫做一个箭头......但不同的是,用箭头的方法,你正在创建一个类的新实例作为对象,然后可以作为一个对象引用。另一个只是调用某个类的某种方法。通过这个对象,你可以存储属性和调用函数,并将事物存储在那个对象中,并且你可以调用该对象的多个实例并单独使用它们......我漫不经心,但有很多事情可以用只调用单独方法的对象是有限的。

+0

匿名downvote?谢谢。 – spanky 2011-05-20 07:26:33

1

你需要利尔接力(Object Oriented Programming),以及PHP

的内部类的功能此实现,被调用的方法,这种方法可以叫上类的实例,或在静态模式下,第一次调用,不要创建类*的一个实例,这个调用的方法“富”是静态的。

class Test { 

    public static $static_atribute; 
    public $normal_atribute; 

    public function Foo($q) { 
     $this->normal_atribute = $q; 
    } 

    public static function SFoo ($q) { 
     // I dont can access to $this 
     self::$static_atribute = $q; 
    } 

} 

Test::Foo("hello"); 
// This thrown an error because $this dont exist in static mode 

Test::SFoo("hello"); 
//This works, and the static property change 

echo Test::$static_atribute; 
// this puts "hello" 

echo Test::$normal_atribute; 
// this thrown an error 

$a = new Test(); 
// $a is an instance of Test 

$a->foo("hello"); 
// this works and the normal_atribute change in THIS instance 

$b = new Test(); 
// $b is anoter instance of Test 

$b->foo("bye"); 
// normal_atribute change in THIS instance 

echo $a->normal_atribute; 
// puts hello 

echo $b->normal_atribute; 
// puts bye 
相关问题