面向对象中静态方法和属性的理解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象中静态方法和属性的理解相关的知识,希望对你有一定的参考价值。

参考技术A php面向对象中一般我们都是实例化一个类得到一个对象来访问这个对象的属性和方法,把对象当做是活动的组件,对象的方法可以用来被调用,对象的属性可以被访问,其实面向对象的很大一个特点是操作通过类实例化的对象来完成,毕竟,类仅仅是对象的一个模板而已,但是对于静态方法或者是静态属性而言,我们可以直接通过类来访问他们,只要我们用static关键字声明他们就好了.

**static是php5后引入的,在这之前的版本是不能使用的,

总结如下:

1.静态方法是以类作为作用域的函数,所以静态方法不能访问非静态的属性,因为他们属于对象而不是类,但是可以访问静态属性

2.在类外部可以通过类名::属性名/方法名来实现的,区别于一般的->普通访问方式,

3.在类的内部,可以通过self::属性名/方法名来实现,

所以根据定义,我们也不能在对象中调用静态方法,因此静态方法和属性又被称为类变量和属性,因此不能再静态方法中使用伪变量$this;

php面向对象中static静态属性和静态方法的调用

关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置,这样就非常容易理解了。
静态属性、方法(包括静态与非静态)在内存中,只有一个位置(而非静态属性,有多少实例化对象,就有多少个属性)。 实例:

class Human{

static public $name = "小妹";

public $height = 180;

static public function tell(){

echo self::$name;//静态方法调用静态属性,使用self关键词

//echo $this->height;//错。静态方法不能调用非静态属性

//因为 $this代表实例化对象,而这里是类,不知道 $this 代表哪个对象

}

public function say(){

echo self::$name . "我说话了";

//普通方法调用静态属性,同样使用self关键词

echo $this->height;

}

}

$p1 = new Human();

$p1->say();

$p1->tell();//对象可以访问静态方法

echo $p1::$name;//对象访问静态属性。不能这么访问$p1->name

//因为静态属性的内存位置不在对象里

Human::say();//错。say()方法有$this时出错;没有$this时能出结果

//但php5.4以上会提示

?>
 
结论:
(1)、静态属性不需要实例化即可调用。因为静态属性存放的位置是在类里,调用方法为"类名::属性名";
(2)、静态方法不需要实例化即可调用。同上
(3)、静态方法不能调用非静态属性。因为非静态属性需要实例化后,存放在对象里;
(4)、静态方法可以调用非静态方法,使用 self 关键词。php里,一个方法被self:: 后,它就自动转变为静态方法;

以上是关于面向对象中静态方法和属性的理解的主要内容,如果未能解决你的问题,请参考以下文章

php面向对象中static静态属性和静态方法的调用

Python面向对象 | 静态方法 staticmethod

Python面向对象 -没有对象?new一个吧

JavaScript面向对象——成员属性静态属性原型属性与JS原型链

PHP面向对象基本概念 类与对象 静态属性 构造/析构方法

py.面向对象,属性,类方法,静态方法,反射