Php 访问类方法之间的差异

Php 访问类方法之间的差异,php,class,Php,Class,直到昨天,我还认为这两种访问类的方法是相同的。谷歌没有注意到(或者我的关键词不好)。通过定义类的新实例而不是直接调用类方法来访问类之间的区别是什么 我几乎不明白我刚才问的是什么,因为我不知道我在问什么,但请允许我举几个例子来帮助我 只要我在PHP中使用类,我就一直在定义类的一个实例,然后从该变量访问方法。以下是一个例子: <?php class Myclass { public function my_method() { return "This is my metho

直到昨天,我还认为这两种访问类的方法是相同的。谷歌没有注意到(或者我的关键词不好)。通过定义类的新实例而不是直接调用类方法来访问类之间的区别是什么

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

只要我在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->mymethod();”调用该类的方法,或者直接像这样调用该方法:“Myclass::mymethod();”,这两者之间有什么区别


提前感谢。

使用::符号将函数称为静态函数。有关更多信息,请参阅PHP手册中的以下页面:

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

请注意,如果您正计划调用该函数,则应将其声明为
静态

class SomeClass {

    static public function StaticFunction() {
        ...
    }

}

表示法用于将函数作为静态函数调用。有关更多信息,请参阅PHP手册中的以下页面:

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

请注意,如果您正计划调用该函数,则应将其声明为
静态

class SomeClass {

    static public function StaticFunction() {
        ...
    }

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

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

在使用Java和C#之后,我有点不安,这不被认为是E#u警告或E#u错误,特别是因为默认情况下不记录E#u STRICT。

Myclass::my#u method()调用应该抛出E#u STRICT警告,因为您在上下文中调用非静态方法

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

在使用Java和C#之后,我有点不安,这不被认为是E#U警告或E#U错误,特别是因为E#U STRICT在默认情况下没有被记录。

我认为你不能那样调用方法。我以为你就是这样称呼这个班的静态成员的。


我认为你不能那样调用方法。我认为这就是您调用类的静态成员的方式。

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

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

所以如果你有这样的东西:

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>';
然后做:

$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;
$a=新acs();
$b=新acs();
echo$a->var'
'; echo$b->var'
'; $a->var='hey'; $b->var='Yooo'; echo$a->var'
'; echo$b->var'
'; echo acs::$var;
您正在做的是:

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

  • 您不回显任何内容,因为公共属性var不存在

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

  • 你呼应他们的价值观(嘿,你)

  • 您回显静态属性var(它是'bla',未更改)


希望这有帮助

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

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

所以如果你有这样的东西:

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>';
然后做:

$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;
$a=新acs();
$b=新acs();
echo$a->var'
'; echo$b->var'
'; $a->var='hey'; $b->var='Yooo'; echo$a->var'
'; echo$b->var'
'; echo acs::$var;
您正在做的是:

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

  • 您不回显任何内容,因为公共属性var不存在

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

  • 你呼应他们的价值观(嘿,你)

  • 您回显静态属性var(它是'bla',未更改)


希望这有帮助

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

例如,当类是“圆”时,实例可能是“这个特定的圆”。类圆可能有成员$center和$radius-每个点都有这些。但每一点的值都不同

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

例如,
$circle->Length()
可以实现为
返回2*Pi*$this->radius

当你说Circle::Length()时会发生什么?没有什么。我是辛特