下面是静态方法和非静态方法的php类代码示例。
示例1:
class A{
//None Static method
function foo(){
if (isset($this)) {
echo '$this is defined (';
echo get_class($this);
echo ")<br>";
} else {
echo "\$this is not defined.<br>";
}
}
}
$a = new A();
$a->foo();
A::foo();
//result
$this is defined (A)
$this is not defined.
示例2:
class A{
//Static Method
static function foo(){
if (isset($this)) {
echo '$this is defined (';
echo get_class($this);
echo ")<br>\n";
} else {
echo "\$this is not defined.<br>\n";
}
}
}
$a = new A();
$a->foo();
A::foo();
//result
$this is not defined.
$this is not defined.
我想弄清楚这两个类之间有什么区别。
正如我们在无静态方法的结果中看到的那样,定义了“$ this”。
但另一方面静态方法的结果没有被定义,即使它们都被实例化了。
我想知道为什么他们有不同的结果,因为他们都被实例化了?
请您告诉我这些代码发生了什么。
答案 0 :(得分:4)
在我们进一步讨论之前:请进入总是的习惯,指定对象属性和方法的可见性/可访问性。而不是写
function foo()
{//php 4 style method
}
写:
public function foo()
{
//this'll be public
}
protected function bar()
{
//protected, if this class is extended, I'm free to use this method
}
private function foobar()
{
//only for inner workings of this object
}
首先,您的第一个示例A::foo
将触发通知(静态调用非静态方法始终执行此操作)。
其次,在第二个示例中,当调用A::foo()
时,PHP不会创建动态实例,也不会在调用$a->foo()
时调用实例上下文中的方法(也将发出通知BTW)。静态函数本质上是全局函数,因为在内部,PHP对象只不过是C struct
,而方法只是具有指向该结构的指针的函数。至少,这是它的要点,more details here
静态属性或方法的主要区别(如果使用得当,效果好)是,它们在所有实例上共享和可访问全局:
class Foo
{
private static $bar = null;
public function __construct($val = 1)
{
self::$bar = $val;
}
public function getBar()
{
return self::$bar;
}
}
$foo = new Foo(123);
$foo->getBar();//returns 123
$bar = new Foo('new value for static');
$foo->getBar();//returns 'new value for static'
如您所见,无法在每个实例上设置静态属性$bar
,如果其值已更改,则更改适用于所有实例。
如果$bar
是公开的,您甚至不需要在任何地方更改属性的实例:
class Bar
{
public $nonStatic = null;
public static $bar = null;
public function __construct($val = 1)
{
$this->nonStatic = $val;
}
}
$foo = new Bar(123);
$bar = new Bar('foo');
echo $foo->nonStatic, ' != ', $bar->nonStatic;//echoes "123 != foo"
Bar::$bar = 'And the static?';
echo $foo::$bar,' === ', $bar::$bar;// echoes 'And the static? === And the static?'
查看工厂模式,(纯粹提供信息)也可以查看Singleton模式。就Singleton模式而言:同样谷歌为什么不使用它。 IoC,DI,SOLID是您很快就会遇到的首字母缩略词。阅读他们的意思并找出他们为什么(每个人都以他们自己的方式)不去单身人士的主要原因
答案 1 :(得分:2)
有时候你需要使用一个方法,但是你不需要调用类,因为类中的某些函数会自动调用,如__construct,__ destruct,......(魔术方法)。
名为class
$a = new A();
$a->foo();
不要叫类:(只是运行foo()函数)
A::foo();