访问类方法之间的区别

时间:2009-12-29 20:58:09

标签: php class

直到昨天我虽然这两种方法都用于访问类相同的类。谷歌出现了注意(或者我的关键字是坏的)。通过定义类的新实例而不是直接调用类方法来访问类之间有什么区别。

我几乎不明白我刚才的问题,因为我不知道我在问什么,但请允许我举几个例子来帮助。

只要我在PHP中使用类,我就一直在定义类的实例,然后从该变量中访问方法。这是一个例子:

<?php
class Myclass
{
   public function my_method() {
      return "This is my method"; 
   }
}
$myclass = new Myclass();

echo $myclass->my_method(); // output: This is my method
?>

这和做这个有什么区别?

<?php
class Myclass
{
   public function my_method() {
      return "This is my method";
   }
}

echo Myclass::my_method(); // output: This is my method
?>

我希望我足够清楚。如果没有简短的概要 - 创建一个类的新实例然后用“$ class-&gt; mymethod();”调用类的方法,或者只是直接调用这样的方法有什么区别: MYCLASS ::的MyMethod();?“

提前致谢。

5 个答案:

答案 0 :(得分:3)

:: notation用于将函数调用为static。有关详细信息,请参阅PHP手册中的这些页面:

本质上,静态函数就像类外的常规函数​​一样。当这样调用时,该函数不在对象上下文中,因此伪变量$this不可用。

请注意,如果您打算将此函数调用为static,则应将该函数声明为class SomeClass { static public function StaticFunction() { ... } }

{{1}}

答案 1 :(得分:2)

当您在static上下文中调用非静态方法时,Myclass :: my_method()调用应该抛出E_STRICT警告。

静态方法是属于类而不是实例的方法。这些方法无法访问任何非静态变量,因为它们没有对它们的引用(因为非静态变量属于实例,而不是类)。

在使用Java和C#之后,我有点不安的是,这不被认为是E_WARNING或E_ERROR,特别是因为默认情况下没有记录E_STRICT。

答案 2 :(得分:0)

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

我认为你不能以这种方式调用方法。我认为这就是你如何称呼该类的静态成员。

答案 3 :(得分:0)

根据我的理解,在创建类的实例时,您正在创建一个对象,因此您可以从该对象调用方法/属性。

当您通过静态调用调用方法/属性时,您正在调用类本身。

所以,如果你有这样的事情:

class acs {
    public $var = 'bla';        
}

然后你做

$a = new acs();
$b = new acs();

echo $a->var . '<br>';
echo $b->var . '<br>';

$a->var = 'hey';
$b->var = 'Yooo';

echo $a->var . '<br>';
echo $b->var . '<br>';

现在有2个类ac的实例,它们以相同的值开始,但现在具有不同的值。

但如果你有这个:

class acs {
    public static $var = 'bla';     
}

然后做:

$a = new acs();
$b = new acs();

echo $a->var . '<br>';
echo $b->var . '<br>';


$a->var = 'hey';
$b->var = 'Yooo';

echo $a->var . '<br>';
echo $b->var . '<br>';

echo acs::$var;

你在做的是:

  • 您可以像以前一样创建实例。

  • 您没有回应,因为公共属性var不存在。

  • 您可以在两个实例中创建公共属性var

  • 你回应他们的价值观(嘿和Yoo)

  • 你回应静态属性var('bla'并且没有改变)

希望这有帮助!

答案 4 :(得分:0)

首先,您应该了解类和对象之间的区别,或类和类的实例。

例如,在class为“Circle”的情况下,实例可能是“this specific circle”。 Class Circle可能有成员$ center和$ radius - 每个点都有这些。但是每个点的价值都不同。

$class->mymethod()是对实例方法的调用,例如$ circle-&gt; Length()。您正在对某个对象的特定实例说些什么。此方法可以访问类成员 - 属于该实例的变量。在PHP中,您可以使用关键字$this来访问这些实例变量。

例如,$circle->Length()可能会被实现为return 2*Pi*$this->radius;

当你说Circle :: Length()时会发生什么?没有。这是调用static methods的语法。因为你没说哪个圈子。圆作为一个班级没有长度。

使用关键字static声明静态方法。无论它做什么,它都无法访问该类的任何实例。这是整个班级所做的事情。

例如,如果您想要计算圆的长度而不实际创建一个圆,那么类圈中可能会有static function calculateLength($radius)。你会把它称为Circle::calculateLength($myRadius)

在我看来,在理解非静态方法之前,你甚至不应该考虑静态方法。