## 普通方法与静态方法调用区别
>[info] 类中的普通方法与静态方法,看似简单,实则复杂,有时让人匪夷所思~~
#### 1. 普通方法
* 创建类Demo,并定义一个公共普通方法:test1( )
* 调用语法:
~~~
//1. 创建对象
对象变量名 = new 类名 ;
//2 调用方法
对象变量 -> 普通方法() ;
例如:
$obj = new Demo();
echo $obj -> test2();
~~~
>[info] 也可以将调用普通方法的二步合并为一步:
~~~
(new 类名) -> 普通方法();
例如: (new Demo) -> test2();
~~~
* 演示源码如下:
~~~
<?php
class Demo{
//定义公共普通方法
public function test1(){
return 'Nomal method:test1';
}
}
//1.创建对象
$obj = new Demo();
//2.用对象来调用普通方法
echo $obj -> test1();
~~~
* 运行结果:
~~~
Nomal method:test1
~~~
* * * * *
#### 2. 静态方法(static)
* 创建类Demo,并定义一个公共静态方法:test2( )
* 调用语法:
~~~
类名::静态方法名(参数列表) ;
例如:
Demo::test2();
~~~
* 演示源码如下:
~~~
<?php
class Demo{
//定义公共静态方法
public static function test2(){
return 'Static method:test2';
}
}
//Demo类静态方法test2()调用
echo Demo::test2();
~~~
* 运行结果:
~~~
Static method:test2
~~~
>[warning] 注意:静态方法也可以像普通方法一样:用对象来调用,但不推荐这样做
* 例如,这样调用静态方法也是可以的:
~~~
$obj = new Demo();
echo $obj -> test2(); //test2()是静态方法
或者:
echo (new Demo) -> test2();
~~~
* 运行结果与使用:类::静态方法名()调用是一样的。
* * * * *
#### 3. 普通方法中调用静态方法
>[info] 静态方法是所有对象所共享的,而普通方法是所有对象都可以调用的。所以,普通方法中调用静态方法是可以的。
* 演示源码:
~~~
<?php
class Demo{
//定义公共普通方法
public function test1(){
//调用静态方法:test2()
return self::test2();
}
//定义公共静态方法
public static function test2(){
return 'Static method:test2';
}
}
//创建Demo类对象并调用普通方法test1()
echo (new Demo) -> test1();
~~~
* 演示代码说明:
(1): 因静态方法可以像普通方法一样访问,所以也可以这样调用静态方法:
~~~
public function test1(){
//调用静态方法,不用self::test2() ,用$this -> test2()
return $this -> test2();
}
~~~
(2): 创建对象与方法调用合并,好处就是省去了定义对象变量名。
>[info] 定义变量名称,是一件很痛苦的事,写代码越多越感有感触
~~~
//创建Demo类对象并调用普通方法test1()
echo (new Demo) -> test1();
~~~
* * * * *
#### 4. 静态方法中调用普通方法
>[info] 普通方法中可以访问静态方法,那么反过来是否成立呢?
* 让我们来测试一下吧~~
* 现在我们修改一下源代码:
~~~
<?php
class Demo{
//定义公共普通方法
public function test1(){
return 'Nomal method:test1';
}
//定义公共静态方法
public static function test2(){
return $this -> test1();
}
}
//Demo类调用静态方法test2()
echo Demo::test2();
~~~
* 运行结果:出错啦!!!
~~~
Fatal error: Using $this when not in object context in 'php文件名'.
~~~
>[danger] 静态方法是属于类的,供所有该类的对象所共享。而普通方法是属于对象的。静态方法生成于编译前,这时对象未生成,因为通过对象访问的普通方法,当然也不能被访问!
* 我们现在思考一个问题:静态方法中能否访问普通属性?答案是:不能!原因与这个相同。
* * * * *
#### 5. 静态属性的访问
>[info] 静态方法中,只能访问静态属性,不能访问普通属性。但是普通方法中可以访问静态属性,这也上面介绍的:普通访问中可以访问静态方法的原理是一样的。
* 实例演示:
~~~
<?php
class Demo{
public static $name = 'ThinkPHP';
//定义公共普通方法
public function test1(){
return self::$name;
}
//定义公共静态方法
public static function test2(){
return self::$name;
}
}
//对象访问
echo (new Demo) -> test1(); // 返回:ThinkPHP
echo (new Demo) -> name; // 返回:错误
//静态访问
echo Demo::test2(); // 返回:ThinkPHP
echo Demo::$name; // 返回:ThinkPHP
~~~
>[danger] 尽管我们可以像调用普通方法一样,用对象调用静态方法,但却不能调用静态属性,一定要注意!
* * * * *
### 总结:
* 普通方法与静态方法的尽管写在一个类中,但却工作在不同的空间;
* 普通方法可以访问静态方法,但反过就不行;
* 静态属性必须静态访问,但静态方法除了静态访问外,也可以对象访问。
- 前言[随时更新]
- 开发环境
- 1.Mac环境
- 2.windows环境
- 模型对象
- 1.创建模型对象
- 2.模型初始化
- 数据对象
- 1.定义数据对象
- 2.创建数据对象
- 1.data方法
- 2.setAttr方法
- 3.__set方法
- 4.查询数据对象
- 1.getData方法
- 2.getAttr方法
- 3.__get方法
- OOP难点总结
- 1.get_class( )实例讲解
- 2.get_called_class( )实例讲解
- 3.__call( )实例讲解
- 3.__callStatic( )实例讲解
- 4.call_user_func_array函数[重点]
- 5.普通方法与静态方法
- 6.在Model源码中的应用
- 7.new static 延迟静态绑定
- PHP标准化规范
- 查询数据
- 1.获取单条:get静态方法
- 2.获取单条:对象查询
- 3.获取多条:all静态方法
- 4.获取多条:对象查询
- 5.获取字段值:value方法
- 6.获取列值:column方法
- 7.动态查询:getBy字段名
- 8.助手函数:model查询
- 9.加载器:Loader类查询
- 10.数据库与模型查询对比
- 新增数据
- 1.sava方法
- 2.savaAll方法
- 3.create静态方法
- 4.insert静态调用
- 更新数据
- 1.单条更新:save方法
- 2.批量更新:saveAll方法
- 3.静态更新:update方法
- 4.查询类Query直接更新
- 5. 闭包更新
- 删除数据
- 1.删除当前记录:delete
- 2.静态条件删除:destory
- 获取器
- 1.模型方法:set属性Attr
- 修改器
- 1.set属性Attr
- 时间戳
- 1.MySQL中日期类型复习
- 2.时间戳功能详解
- 软删除[重点]
- 1.traits详解[选学内容]
- 2.SoftDelet类源码分析
- 3. delete实例删除
- 4.destroy条件删除
- 5.restore恢复数据
- 类型转换
- 1. 规则设置
- 2. 实例演示
- 查询范围
- 1. 基本概念
- 2.实例演示