php学习笔记(2)
函数
function foo($arg_1, $arg_2, ..., $arg_n) {
……
}
缺省情况下,函数参数通过值传递。如果想要通过引用传递,可以在函数定义中该参数的前面先加符号 &
默认参数,默认值必须是常量表达式,不能是诸如变量,类成员,或者函数调用等表达式。任何默认参数必须放在任何非默认参数的右侧。
function makecoffee($type = "cappuccino") {
……
}
支持可变数量的参数列表
从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用操作符 & :
<?php
function &returns_reference()
{
return $someref;
}
$newref =& returns_reference();
?>
可变函数,如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途。
$func = 'foo';
$func(); // This calls foo()
类(PHP4)
类是变量与作用于这些变量的函数的集合。变量通过var来定义,函数通过 function 来定义
定义类
class Cart {
var $items; // 购物车中的物品
function add_item($artnr, $num) {
$this->items[$artnr] += $num;
}
}
定义对象 new
$cart = new Cart;
$cart->add_item("10", 1);
伪变量$this 可以理解为“我自己的”或者“当前对象”。
继承,基类使用parent
class Named_Cart extends Cart {
……
}
构造函数,与类同名,当使用 new 操作符创建一个类的实例时,构造函数将会自动调用。
class Auto_Cart extends Cart {
function Auto_Cart() {
$this->add_item ("10", 1);
}
}
析构函数,PHP 中没有析构函数。可以用 register_shutdown_function()
来替代模拟大多数析构函数的效果。
范围解析操作符(::)
class A {
function example() {
echo "I am the original function A::example().<br />\n";
}
}
// A 类没有对象,这将输出
// I am the original function A::example().<br />
A::example();
类(PHP5)
自动加载对象,通过定义一个 __autoload 函数,它会在试图使用尚未被定义的类时自动调用。
<?php
function __autoload($class_name) {
require_once $class_name . '.php';
}
$obj = new MyClass1();
$obj2 = new MyClass2();
?>
构造函数,为了实现向后兼容性,如果 PHP 5 在类中找不到 __construct() 函数,它就会尝试寻找旧式的构造函数,也就是和类同名的函数。
析构函数,会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
父类的构造函数、析构函数不会被引擎暗中调用。要执行父类的构造、析构函数,必须在子类的构造、析构函数体中显式调用parent::__construct()、 parent::__destruct()。
访问控制,是通过在前面添加关键字 public、protected 或 private 。类成员都必须使用关键字public、protected 或 private 进行定义
范围解析操作符(::),可以用于访问静态成员、方法和常量,还可以用于覆盖类中的成员和方法。
static 不实例化类而直接访问。
类常量,值将始终保持不变。
抽象类和抽象方法
abstract class AbstractClass{……}
class ConcreteClass1 extends AbstractClass{……}
接口(interface),指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
interface iTemplate {……}
class Template implements iTemplate {……}
重载(overloading)是指动态地"创建"类属性和方法。是通过 魔术方法(magic methods)来实现的。
注意:与其它绝大多数面向对象语言不同
对象迭代 通过foreach
来遍历对象中的属性。默认情况下,在外部迭代只能得到外部可见的属性的值。
使用Iterator接口可以让对象自行决定如何迭代自已。
class MyIterator implements Iterator{...}
让类实现IteratorAggregate接口,这样你的类就不用强制性地实现 Iterator接口中的所有方法。
class MyCollection implements IteratorAggregate{...}
final 关键字。如果父类中的方法被声明为final,则子类无法覆盖该方法; 如果一个类被声明为final,则不能被继承。
没有评论:
发表评论