php学习小记2 类与对象
php类的一些特性:
1. 伪变量$this。$this是一个到主叫对象的引用。取值:该方法所从属的对象,可能是另外的对象(前提,当该方法被静态调用时)。$this变量存在于一个类的非静态方法中,在静态方法中是不存在的。
<?php
class A{
function f() {
if( isset($this) ) {
echo '$this is defined ('.get_class($this).')\n';
}
else {
echo '$this is not defined.\n';
}
echo "<br />";
}
};
class B{
function g() {
A::f();
}
} $a = new A();
$a->f();
A::f(); $b = new B();
$b->g();
B::g();
?>
结果:
$this is defined (A)\n Strict Standards: Non-static method A::f() should not be called statically in /var/www/php/this.php on line 21
$this is not defined.\n Strict Standards: Non-static method A::f() should not be called statically, assuming $this from incompatible context in /var/www/php/this.php on line 15
$this is defined (B)\n Strict Standards: Non-static method B::g() should not be called statically in /var/www/php/this.php on line 25 Strict Standards: Non-static method A::f() should not be called statically in /var/www/php/this.php on line 15
$this is not defined.\n
其中调用非静态方法时是不允许的,所以这里产生了Strict警告。忽略警告信息,可以看出this的从属关系。
2. new:new className(), 其中className可以用变量代替,这一点上与php中可变函数类似,(对比一下,java中可以用反射机制去动态的创建,C++中比较麻烦,当然只是写起来比较麻烦,代码量比较大。。。)在类内定义时可以采用new self和new parent创建对象。
3. 对象的赋值以及引用:这个跟java比较像,一旦一个对象被创建就会一直驻留(当然会有垃圾回收机制来处理不使用的对象),对于变量的赋值,并不会影响到对象的改变,只是影响变量的值。当然在函数传递对象的时候也是这样的。引用就是将两个或者多个变量进行绑定,无论何时它们的值都是一样的。具体可以参考下面这个例子:
<?php
class A{
public $var = "A";
function func($name){
echo "object ".$name." call function func ".$this->var;
echo "<br />";
}
}; $var1 = new A();
$var2 = $var1;
$var3 = & $var1; $var1->func('$var1');
$var2->func('$var2');
$var3->func('$var3'); $var1->var = "A change to B"; $var1->func('$var1');
$var2->func('$var2');
$var3->func('$var3'); $var1 = null; //$var1->func('$var1');
//$var2->func('$var2');
//$var3->func('$var3'); var_dump( $var1 );
echo"<br />";
var_dump( $var2 );
echo"<br />";
var_dump( $var3 );
echo"<br />"; ?>
结果:
object $var1 call function func A
object $var2 call function func A
object $var3 call function func A
object $var1 call function func A change to B
object $var2 call function func A change to B
object $var3 call function func A change to B
NULL
object(A)#1 (1) { ["var"]=> string(13) "A change to B" }
NULL
4. extends 继承,不支持多重继承,一个类只能继承一个基类,覆盖:用同名函数或者同名变量,当覆盖方法时参数必须保持一致。父类中final方法不允许覆盖,parent::来访问被覆盖的方法和属性,构造函数除外。
5.属性方法:非静态属性必须标明其访问权限(在php5.4版本下实验),静态属性如果未标明其访问权限,默认情况下为public.
一个特别的地方:同一个类的对象即使不是同一个实例也可以互相访问对方的私有和保护成员
还有一个需要注意的地方:属性的初始化,初始化的值必须在编译阶段可以确定下来,所以必须是常数(不可以是变量的值或者表达式)。
另外一旦属性或者对象被覆盖,那么父类中的属性或者对象在本类中都是不可见的,对于静态的方法或者属性是可以通过parent来调用,其他的方法或者属性不可用。
<?php
class Test{
private $foo; public function __construct($foo){
$this->foo = $foo;
} private function bar(){
echo 'Accessed the private method.<br />';
}
public function baz(Test $other){
$other->foo = 'hello';
var_dump( $other->foo );
echo "<br />";
$other->bar();
} }; $test = new Test( 'test' );
$test->baz( new Test('other') ); ?>
string(5) "hello"
Accessed the private method.
6. $this, self, parent
$this只能适用于一个非静态方法和属性,静态方法中不存在this。self和parent一样,都是只适用于静态方法和属性的调用,区别在于self是指向自己的静态方法和属性,parent是指向父类的静态方法和属性,调用方式:self::$var/self::func(), parent::$var/parent::func().
7. static静态属性和静态方法不能用对象->来直接调用,静态属性如果未指明其访问权限,默认情况下为public.类常量:必须在编译前确定的值,只能为数值,不是任何的表达式。访问方式:$classname :: constant
8.构造函数和析构函数:构造函数形式__construct(), 析构函数形式__destory()
如果子类中定义了构造函数,那么将不会显式的调用父类中的构造函数,如果未定义,将会继承父类的构造函数并调用,析构函数也是同样的情况。
php学习小记2 类与对象的更多相关文章
- Java学习笔记之---类和对象
Java学习笔记之---类和对象 (一)类 类是一个模板,它描述一类对象的行为和状态 例如:动物类是一个类,动物们都有属性:颜色,动物们都有行为:吃饭 public class Dog { Stri ...
- 学习笔记——Java类和对象
今天学习了Java的类和对象的相关知识,由于Java面向对象的编程的思想和C++几乎一样,所以需要更多的关注Java的一些不同之处. 1.类 1.1 在类这一块,除了基本的成员变量,成员方法,构造函数 ...
- 【Python学习之七】类和对象
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 python3.6 一.面向对象编程1.概念(1)面向对象编程(OOP ...
- Java学习笔记 04 类和对象
一.类和对象的概念 类 >>具有相同属性和行为的一类实体 对象 >>实物存在的实体.通常会将对象划分为两个部分,即静态部分和动态部分.静态部分指的是不能动的部分,被称为属性,任 ...
- Java学习第二篇:类,对象,成员属性,成员方法,构造方法,类变量,类方法
一.类的定义 一个全面的类定义是比较复杂的, 定义如下:
- (转)一步一步学习PHP(5)——类和对象
OO的强大我不想再多说,如果你不认同OO,那么当你放眼当前流行的语言,有哪个又不支持OO的,也许这个很有说服力了吧. 在这一节中,我们就来看看在PHP中如何创建一个类和对象. 1. 创建类 在PHP中 ...
- Java学习笔记之——类与对象
1.参数的传递方式 1)值传递 2)引用传递 2.类和对象: (1)类的定义: public class 类名{ 类型 属性1: 类型 属性2: ……… public 返回值类型 方法名1(形参){ ...
- Scala学习随笔——深入类和对象
函数化对象(又称方程化对象)指的是所定义的类或对象不包含任何可以修改的状态. 本篇随笔就是着重记录函数化对象.定义了一个有理数类定义的几个不同版本,以介绍 Scala 类定义的几个特性:类参数和构造函 ...
- java学习(2):类和对象
一.类 类可以看成是创建对象的模板,它描述一类对象的行为和状态.创建对象也叫类的实例化.类必须先定义才能使用. 通过下面一个简单的类来理解下Java中类的定义: public class Dog { ...
随机推荐
- WPF一个简单的垂直菜单样式的实现
以前制作类似于垂直菜单功能的控件我都是Listbox和一个Popup实现的,今天尝试着用Menu做了一个简单垂直菜单,就当是做了个小练习写了这篇随笔~: 有什么不对的地方希望大家指正,分享和记录也是一 ...
- Authentication for the REST APIs
HTTP基本认证原理 在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份认证的方法,当一个客户端向HTTP服务器进行数据请求时,如果客户端未被 ...
- android报表图形引擎(AChartEngine)demo解析与源码
AchartEngine支持多种图表样式,本文介绍两种:线状表和柱状表. AchartEngine有两种启动的方式:一种是通过ChartFactory.get***View()方式来直接获取到view ...
- BZOJ 3982 Stacking Plates 解题报告
我们首先可以得到:如果有一堆盘子里有一些相邻的盘子的直径相等,那么自然这些盘子可以统一处理,就可以缩成一个了. 然后我们接着考虑给每一堆盘子都染上一种颜色,那么操作的次数 step = diff * ...
- What Can I Do With This Major?
What Can I Do With This Major? Majors Don’t see your major? Accounting Advertising Africana Studies ...
- new jQuery.common
var $c=null;jQuery(function(){$c=new jQuery.common(); $c.methods.init(); }); (function($) { $.common ...
- ORMBase对象/关系型数据库映射在MVC中的应用(二)
3.DataBase基类,查询方法返回值是List<T>,并且是分页的,ThePart.dll版本2.0中封装了一个PageInfo类,作为分页的类型.这种方法很机械,也很狗血..建议大家 ...
- redis消息队列
http://blog.csdn.net/21aspnet/article/details/7455032
- app与server联系
--- /frameworks/base/services/java/com/android/server目录下SystemServer.java 在ServerThread的run函数中增加加载Rf ...
- 【原创】MIPS·Verilog·FPGA
时至今日,终于将全部的计划55条MIPS指令在FPGA上全部验证完毕,通过这近一个月的不断的修改调试.修改调试,我对整个流程对MIPS有了深刻的体会和认识.借着刚刚现阶段任务的兴奋和短暂的空闲时间,将 ...