1.类成员语法
<?php
class A
{
/* 访问修饰符
* java中有公用 私有 包类可见(受保护) 空(介于公用和私有之间)
* php 只有三个 public private protected 不能为空
* */
public $i = 5;
public static $y = "static string\n";
/* 构造方法
* */
function __construct(){
echo "这是构造方法\n";
}
function fn(){
/* 方法内部无法访问字段,必须配合this
* 类似js中方法访问内部字段需要使用this
* */
echo $this -> i;
echo '这是一个方法';
}
/* 静态方法
* self指向本类(可以在静态/非静态)
* $this指向本类(只能在非静态使用)
* */
static function fn_2(){
echo self::$y;//相当于外部调用(A::$y)
echo "这是一个静态方法\n";
}
}
/* 静态方法调用
* */
A ::fn_2();
echo A::$y;
$a = new A();
/* 不可思议之一 -- 多次调用构造方法
* */
$a -> __construct();
//print_r($a);
//$a->fn();
/* 如js一样动态添加属性/方法
* */
$a->x = 'test add';
echo $a->x;
echo "\n";
/* 删除$a中的一个元素
* */
unset($a->x);
/* 此遍历相当于js中的for in
* */
foreach($a as $k=>$v){
echo "$k:$v\n";
}
2. 类命名空间
<?php
namespace a\b\c;
class A
{
public $i = '这是A';
}
namespace a\b\d;
/* 导入上个命名空间的class A(use 路径)
* use as 用来解决命名空间中类名冲突
* new A()就是d下的A,想得到c下的A就new CA();
* */
//use a\b\c\A;
use a\b\c\A as CA;
class A
{
public $b = '这是B';
}
$a = new CA();
print_r($a);
3. 类语法 – 多态
3.1 继承
<?php
/* 类似与java final修饰后不能继承/重写
* */
class A
{
public $text = "测试父类继承";
function __construct()
{
echo "创建了一个A\n";
}
function fn()
{
echo "这是父亲的方法\n";
}
}
class B extends A
{
/* 在java中 构造方法不会被重写,不会被继承
* 在构造方法中调用父类构造方法,用super(),且只能调用一次且放在首行。
*
* 在js中 子类不能写构造方法。但是能被继承
*
* 在php中 构造方法会被重写,会被继承。
* 在构造方法中调用父类构造方法,用parent::(无次数,位置限制)
* */
function __construct()
{
parent::__construct();
parent::__construct();
echo "创建了一个B\n";
}
function fn()
{
/* java调用父类的方法是 super.fn();
* js super.fn();
* php 见下 parent::fn();
* */
parent::fn();
echo "这是重写A的方法";
}
}
$b = new B();
$b->fn();
//print_r($b);
3.2 抽象
// 类似于java
abstract class AbstractClass{
// 强制要求子类定义这些方法
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// 普通方法(非抽象方法)
public function printOut() {
print $this->getValue() . "\n";
}
}
class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";
3.3 接口
<?php
// 声明一个'iTemplate'接口,类似于java
interface iTemplate
{
public function setVariable($name, $var);
public function getHtml($template);
}
// 实现接口
// 下面的写法是正确的
class Template implements iTemplate
{
public $lists = array();
public function setVariable($name, $var)
{
$this->lists[$name] = $var;
}
public function getHtml($template)
{
echo "{$template}";
}
}
$template = new Template();
$template->getHtml('测试');
$template->setVariable('张三', '250');
echo $template->lists['张三'];
3.4 延迟静态绑定
延迟到方法执行时,才绑定。
<?php
class A{
const XX ="这是A的常量\n";
public function fn(){
/* 使用self:: 会绑定A中的常量XX
* 使用static:: 延迟静态绑定为B的常量XX
* (B中有常量XX,若无为A中的常量)
* */
echo static::XX;
}
}
class B extends A{
const XX ="这是B的常量\n";
}
$b = new B();
$b->fn();
5.5 流程处理函数
die/exit 退出
include
eg: include 'URL';
include_once
ps:用法和includ一样,主要用于区别函数的两次导入会报错
require,require_once
ps:用法和include一样,但是include出错是警告,require会终止程序执行。
return 返回值;
ps:在函数中使用global $i和return $i一样
/* 老版本的php加载其他php方式
* 要求 文件名和类名必须一致
* 新版本 spl_autoload_register();
* */
function __autoload($cn){
return "$cn.php";
}
spl_autoload_register();