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 类与对象的更多相关文章

  1. Java学习笔记之---类和对象

    Java学习笔记之---类和对象 (一)类 类是一个模板,它描述一类对象的行为和状态  例如:动物类是一个类,动物们都有属性:颜色,动物们都有行为:吃饭 public class Dog { Stri ...

  2. 学习笔记——Java类和对象

    今天学习了Java的类和对象的相关知识,由于Java面向对象的编程的思想和C++几乎一样,所以需要更多的关注Java的一些不同之处. 1.类 1.1 在类这一块,除了基本的成员变量,成员方法,构造函数 ...

  3. 【Python学习之七】类和对象

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 python3.6 一.面向对象编程1.概念(1)面向对象编程(OOP ...

  4. Java学习笔记 04 类和对象

    一.类和对象的概念 类 >>具有相同属性和行为的一类实体 对象 >>实物存在的实体.通常会将对象划分为两个部分,即静态部分和动态部分.静态部分指的是不能动的部分,被称为属性,任 ...

  5. Java学习第二篇:类,对象,成员属性,成员方法,构造方法,类变量,类方法

    一.类的定义 一个全面的类定义是比较复杂的,  定义如下:

  6. (转)一步一步学习PHP(5)——类和对象

    OO的强大我不想再多说,如果你不认同OO,那么当你放眼当前流行的语言,有哪个又不支持OO的,也许这个很有说服力了吧. 在这一节中,我们就来看看在PHP中如何创建一个类和对象. 1. 创建类 在PHP中 ...

  7. Java学习笔记之——类与对象

    1.参数的传递方式 1)值传递 2)引用传递 2.类和对象: (1)类的定义: public class 类名{ 类型 属性1: 类型 属性2: ……… public 返回值类型 方法名1(形参){ ...

  8. Scala学习随笔——深入类和对象

    函数化对象(又称方程化对象)指的是所定义的类或对象不包含任何可以修改的状态. 本篇随笔就是着重记录函数化对象.定义了一个有理数类定义的几个不同版本,以介绍 Scala 类定义的几个特性:类参数和构造函 ...

  9. java学习(2):类和对象

     一.类 类可以看成是创建对象的模板,它描述一类对象的行为和状态.创建对象也叫类的实例化.类必须先定义才能使用. 通过下面一个简单的类来理解下Java中类的定义: public class Dog { ...

随机推荐

  1. 面向站长和网站管理员的Web缓存加速指南

    详细了解HTTP缓存控制及为什么要缓存. 英文版: http://www.mnot.net/cache_docs/ 中文版:http://www.chedong.com/tech/cache_docs ...

  2. Extjs 更新数据集Ext.PagingToolbar的start参数重置的处理

    问题:当翻页后,比如当前是第二页,start参数此时是5(初始为0),当切换左侧分类时,我们期望的是从所选分类下明细记录的第一条开始显示,结果发现不是这样,依然是从新数据的第二页开始显示,就是说ext ...

  3. canvas 乒乓球

    <!DOCTYPE html> <html> <head> <title>Bouncing Ball With inputs</title> ...

  4. Python属性、方法和类管理系列之----属性初探

    在学习dict的时候,肯定听过dict是Python中最重要的数据类型,但是不一定知道为什么.马上你就会明白原因了. Python中从模块.到函数.到类.到元类,其实主要管理方法就是靠一个一个的字典. ...

  5. sjtu1364 countcountcount

    Description 我有一个元素个数为\(n\)的整数数组\(a\)和\(Q\)个问题,每个问题有\(x,y\)两个参数,我要数有多少个整数\(K\)满足\(K\)在\(a[x]-a[y]\)中出 ...

  6. jquery upgrade

    http://www.ifanybug.com/article/00125 http://zhidao.baidu.com/question/69399476.html http://www.tmtp ...

  7. Linux下eclipse的安装以及配置

    在安装好jdk并配置好后,就可以进行eclipse的安装了,其步骤如下: 1.下载eclipse 我所用的eclipse为:eclipse-dsl-juno-SR1-linux-gtk.tar 2. ...

  8. asp.net 简单实现禁用或启用页面中的某一类型的控件

    我们在提交一个表单的时候,可能由于网络或服务器的原因,处理很慢,而用户在处理结果出来之前反复点击按钮提交.这样很容易造成不必要的麻烦甚至是错误.说了这么多,其实就是要实现一个禁用某些控件的一种功能.好 ...

  9. [jobdu]数组中的逆序对

    http://ac.jobdu.com/problem.php?pid=1348 数组中的逆序对也是个常见的题目,算法导论中也有一些描述,参考:http://www.cnblogs.com/wuyue ...

  10. 发现一个好的开源项目:lomoX(挑着看,每天看一点,看一年就ok了)——用Webkit开发桌面软件,炫

    http://www.oschina.net/p/lomox https://github.com/caidongyun/lomox 用Web技术做桌面客户端.虽然仍然免不了要分发客户端,但好处是,界 ...