关键字和特殊变量
new,class,extends。这三个,大家都懂得。
::,范围解析操作符(也可称作 Paamayim Nekudotayim)或者更简单地说是一对冒号,可以用于访问静态成员、方法和常量。还可以用于覆盖类中的成员和方法。
parent和self。parent指的就是派生类在 extends 声明中所指的基类的名字。这样做可以避免在多个地方使用基类的名字。
$this 伪变量。$this指向当前的实例。$this却不一定是方法所属的对象。有时候类A内的代码会调用类B的一个静态方法。参考例子:php.net/manual/zh/language.oop5.basic.php">http://www.php.net/manual/zh/language.oop5.basic.php
static关键字。如果声明类成员或方法为static,就可以不实例化类而直接访问。但是,除了静态方法,不能通过一个对象来访问其中的静态成员。在静态方法中,不使用$this。而使用self:: 。
final关键字。可以作用于类(class)和方法(function),会使类不能被继承,方法不能被覆盖。
属性
可以初始化,但初始化的值必须是常数。常量前面用const个关键字,常量的值必须是一个定值,不能是变量,类属性或其它操作(如函数调用)的结果。
构造函数和析构函数
这两个函数都不会暗中调用基类的响应函数,这跟java的构造器机制不一样。要达到这样的效果,必须显示执行。析构函数中不能抛出异常。
抽象类:声明为抽象的类方法不能包含具体实现,抽象类不能实例化。必须先被继承,再实例化其子类。而且子类的访问控制要和抽象类一样,或者更加宽松。抽象类至少包含一个抽象方法的。
接口
使用接口(interface),你可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
定义的所有方法都必须是public,且方法为空
可以定义常量,但是没有属性
接口的实现(implements)必须实现所有方法,而且可以实现多个接口(注意,方法不能重名)。
接口可以被另外的接口继承 (extends)
代码如下 | 复制代码 |
<? class VipUser extends AbstractUser { class InnerUser extends AbstractUser { |
Product.php
代码如下 | 复制代码 |
<? include_once("User.php"); include_once("Product.php"); //买了产品到底多少钱呢? class ProductSettle{ public static function finalPrice(User $_user,Product $_product,$number = 1){ $price = $_user->getDiscount() * $_product->getProductPrice() * $number; return $price; } } ?> |
下面的例子是实现。大家可以自己分析下。
代码如下 | 复制代码 |
<? $number = 10;
$user = new InnerUser("Tom"); |
bool in_array ( mixed $needle , array $haystack [, bool $strict ] )
在 haystack 中搜索 needle,如果找到则返回 TRUE,否则返回 FALSE。
如果第三个参数 strict 的值为 TRUE 则 in_array() 函数还会检查 needle 的类型是否和 haystack 中的相同。
Note:
如果 needle 是字符串,则比较是区分大小写的。
Note:
在 PHP 版本 4.2.0 之前,needle 不允许是一个数组。
注释:如果 value 参数是字符串,且 type 参数设置为 true,则搜索区分大小写。
Example #1 in_array() 例子
代码如下 | 复制代码 |
<?php $os = array("Mac", "NT", "Irix", "Linux"); if (in_array("Irix", $os)) { echo "Got Irix"; } if (in_array("mac", $os)) { echo "Got mac"; } ?> |
第二个条件失败,因为 in_array() 是区分大小写的,所以以上程序显示为:
Got Irix
Example #2 in_array() 严格类型检查例子
代码如下 | 复制代码 |
<?php if (in_array('12.4', $a, true)) { |
注:in_array函数返回的是0,1
当转换为 boolean 时,以下值被认为是 FALSE:
布尔值 FALSE
整型值 0(零)
浮点型值 0.0(零)
空白字符串和字符串 "0"
没有成员变量的数组
没有单元的对象
特殊类型NULL(包括尚未设定的变量)
所有其它值都被认为是 TRUE(包括任何资源)。
警告
-1 和其它非零值(不论正负)一样,被认为是 TRUE
这次这个函数是
ksort() 函数按照键名对数组升序排序,为数组值保留原来的键。
可选的第二个参数包含附加的排序标志。
若成功,则返回 TRUE,否则返回 FALSE。
语法
ksort(array,sorttype)参数 描述
array 必需。规定要排序的数组。
sorttype 可选。规定如何排列数组的值。可能的值:
SORT_REGULAR - 默认。以它们原来的类型进行处理(不改变类型)。
SORT_NUMERIC - 把值作为数字来处理
SORT_STRING - 把值作为字符串来处理
SORT_LOCALE_STRING - 把值作为字符串来处理,基于本地设置*。
*:该值是 PHP 4.4.0 和 5.0.2 新加的。在 PHP 6 之前,使用了系统的区域设置,可以用 setlocale() 来改变。自 PHP 6 起,必须用 i18n_loc_set_default() 函数。
例子
代码如下 | 复制代码 |
<?php Array( [b] => Cat [c] => Horse [e] => Sog) |
rsort() 函数对数组的元素按照键值进行逆向排序。与 arsort() 的功能基本相同。
注释:该函数为 array 中的单元赋予新的键名。这将删除原有的键名而不仅是重新排序。
如果成功则返回 TRUE,否则返回 FALSE。
可选的第二个参数包含另外的排序标志。
语法
rsort(array,sorttype)参数 描述
array 必需。输入的数组。
sorttype 可选。规定如何排列数组的值。可能的值:
SORT_REGULAR - 默认。以它们原来的类型进行处理(不改变类型)。
SORT_NUMERIC - 把值作为数字来处理
SORT_STRING - 把值作为字符串来处理
SORT_LOCALE_STRING - 把值作为字符串来处理,基于本地设置*。
*:该值是 PHP 4.4.0 和 5.0.2 新加的。在 PHP 6 之前,使用了系统的区域设置,可以用 setlocale() 来改变。自 PHP 6 起,必须用 i18n_loc_set_default() 函数。
例子
代码如下 | 复制代码 |
<?php Array $animals = array("dog"=>"large", "cat"=>"medium", "mouse"=>"small"); rsort($animals); Use KSORT() or KRSORT() to preserve associative keys. |
在PHP5中增强了面向对象的机制,加入了面向对象常见的public、private、protected这样的访问控制机制。从字面意思来理解:
Public 无疑是公共的意思,意思是说类本身和其外部的子类都可以访问这个属性或者方法;
Private 英文翻译过来就是私有的意思,只能是类本身在类的内部才能访问——实例化的对象句柄不能访问该属性和方法,子类也不能访问;
Protected 受保护的属性或者方法,这个属性或者是方法只能被类本身或者子类的内部访问,实例化的对象句柄不能访问。
现在我们举个例子来说这个问题。
假设有一个宝石博物馆的管理员 小李,把仓库中的宝石分为三个类别,红宝石,蓝宝石,绿宝石。并且划分了属性,红宝石是国家的任何人都可以参观标签为(public),蓝宝石管理员小李家族传下来的(protected),绿宝石是小李自己在山上见到的(private)。
那么我们可以这样认为:
public标签的红宝石,是国家的——全民所有,只要是合法的国家的公民都能够参看和拍照。
Protected 这个是受保护的,只有小李家族的人(小李的孩子或者孙子)在特定的房间里面才能参观和拍照,不准拿到房间外边看——太小气了!
Private 这个是私有的,小李不想让其他人知道,更不想让拍照了,所以只能供小李在小李的房间里看看而已,其他的人即使小李的孩子们都没有办法看到
实例
代码如下 | 复制代码 |
<?php error_reporting(E_ALL);
class test{ public $public; private $private; protected $protected; static $instance; public function __construct(){ $this->public = 'public <br>'; $this->private = 'private <br>'; $this->protected = 'protected <br>'; } static function tank(){ if (!isset(self::$instance[get_class()])) { $c = get_class(); self::$instance = new $c; }
return self::$instance; }
public function pub_function() { echo "you request public function<br>"; echo $this->public; echo $this->private; //private,内部可以调用 echo $this->protected; //protected,内部可以调用 $this->pri_function(); //private方法,内部可以调用 $this->pro_function(); //protected方法,内部可以调用 } protected function pro_function(){ echo "you request protected function<br>"; } private function pri_function(){ echo "you request private function<br>"; } }
$test = test::tank(); echo $test->public; echo $test->private; //Fatal error: Cannot access private property test::$private echo $test->protected; //Fatal error: Cannot access protected property test::$protected $test->pub_function(); $test->pro_function(); //Fatal error: Call to protected method test::pro_function() from context $test->pri_function(); //Fatal error: Call to private method test::pri_function() from context
?>
<?php error_reporting(E_ALL); class test{ public $public; private $private; protected $protected; static $instance; public function __construct(){ $this->public = 'public <br>'; $this->private = 'private <br>'; $this->protected = 'protected <br>'; } static function tank(){ if (!isset(self::$instance[get_class()])) { $c = get_class(); self::$instance = new $c; } return self::$instance; } public function pub_function() { echo "you request public function<br>"; echo $this->public; echo $this->private; //private,内部可以调用 echo $this->protected; //protected,内部可以调用 $this->pri_function(); //private方法,内部可以调用 $this->pro_function(); //protected方法,内部可以调用 } protected function pro_function(){ echo "you request protected function<br>"; } private function pri_function(){ echo "you request private function<br>"; } } $test = test::tank(); echo $test->public; echo $test->private; //Fatal error: Cannot access private property test::$private echo $test->protected; //Fatal error: Cannot access protected property test::$protected $test->pub_function(); $test->pro_function(); //Fatal error: Call to protected method test::pro_function() from context $test->pri_function(); //Fatal error: Call to private method test::pri_function() from context ?> 从上面的例子中,我们可以看出, <?php
class test{ public $public; private $private; protected $protected; static $instance;
public function __construct(){ $this->public = 'public <br>'; $this->private = 'private <br>'; $this->protected = 'protected <br>'; } protected function tank(){ //私有方法不能继承,换成public,protected if (!isset(self::$instance[get_class()])) { $c = get_class(); self::$instance = new $c; } return self::$instance; }
public function pub_function() { echo "you request public function<br>"; echo $this->public; } protected function pro_function(){ echo "you request protected function<br>"; echo $this->protected; } private function pri_function(){ echo "you request private function<br>"; echo $this->private; } }
class test1 extends test{
public function __construct(){ parent::tank(); parent::__construct(); } public function tank(){ echo $this->public; echo $this->private; //Notice: Undefined property: test1::$private echo $this->protected; $this->pub_function(); $this->pro_function(); $this->pri_function(); //Fatal error: Call to private method test::pri_function() from context 'test1' }
public function pro_extends_function(){ echo "you request extends_protected function<br>"; } public function pri_extends_function(){ echo "you request extends_private function<br>"; } }
error_reporting(E_ALL); $test = new test1(); $test -> tank(); //子类和父类有相同名字的属性和方法,实例化子类时,子类的中的属性和方法会盖掉父类的。
?> |