<?php
/**
* php之面向对象初体验
* 对象含有属性和方法,都有静态和非静态区分
* 访问属性object->property
* 访问方法object->method()
* 声明:公共:public;私有:private;受保护:protected
*/
class Test
{
//关于属性可以在类里实例化,也可以在类外实例化
//以下的非静态成员必须实例化后才能调用
public $math = 90,$english = 88;
public $chinese,$art;
private $music = 99;
/*
* 构造函数(构造器)
* 构造方法:在创建对象时自动调用,主要用来初始化类的实例对象
* 构造方法必须用二个下划线开头
* 它在实例化类的时候自动调用
* 参数通常是要被初始化的类属性
*/
public function __construct($math='',$english='')
{
$this->math=$math;
$this->english=$english;
}
public function getGrade()
{
return '数学成绩为:'.$this->math.' 英语成绩为:'.$this->english;
}
//创建公共接口来访问私有属性
public function getMusic()
{
return '音乐成绩是:'.$this->music;
}
}
$xiaoMing = new Test(80,90);
$xiaoMing->chinese=89;
$xiaoMing->art=67;
echo $xiaoMing->getGrade();
echo '<br>';
echo $xiaoMing->math;
echo '<hr>';
echo '小明的语文成绩是'.$xiaoMing->chinese.' 美术成绩为是'.$xiaoMing->art;
//子类操作
class Exam extends Test
{
//创建子类自有的属性
private $firstTime = '0900AM-1130AM'; //对于私有属性,只能在类内部使用,外部要访问,可以创建一个公共方法来提供外部接口
private $lastTime = '1400PM-1730PM'; //受保护的属性,只能在当前类和子类中访问,外部也不可访问
protected $level;
//会自动继承父类的构造函数,如果不需要手动删除
public function __construct($math = '', $english = '',$level='高中部')
{
parent::__construct($math, $english);
$this->level=$level;
}
//创建子类的方法
public function getTime()
{
return $this->level.'数学考试时间:'.$this->firstTime.'<br>英语考试时间:'.$this->lastTime;
}
public function loca($loca='教学楼一')
{
return $this->level.'的考试地址在'.$loca;
}
}
echo '<hr>';
echo (new Exam)->getTime(); //通过公共接口来访问私有属性,
echo '<br>';
echo (new Exam)->getMusic(); //通过公共接口访问受保护的属性
$xiaoHong = new Exam(88,99,'初中部');
echo '<br>';
echo $xiaoHong->getTime();
echo '<br>';
echo $xiaoHong->loca('初中部第二大楼');
<?php
/**
* final关键字的使用
*/
class Demo1
{
//final声明禁止子类继续调用父类中被final声明的方法
//final也可以放在class前,表示不允许继承该类
// final public function calculate($a=2,$b=3)
public function calculate($a=2,$b=3)
{
$c = $a + $b;
return '和为:'.$c;
}
}
class Demo2 extends Demo1
{
public function calculate($a = 2, $b = 3)
{
return parent::calculate($a, $b); // TODO: Change the autogenerated stub
}
}
$obj1 = new Demo1();
$obj2 = new Demo2();
echo $obj1->calculate();
echo '<br>';
echo $obj2->calculate(4,9);
echo '<br>';
//接下来了解一下判断对象是否是类的实例
echo $obj2 instanceof Demo2;
echo '<br>';
echo $obj2 instanceof Demo1;
<?php
/**
* 访问类或对象成员
* 1. 访问对象成员: '->'对象访问符
* 2. 访问类成员: '::' 范围解析符
*
* $this和self
* 1. $this:引用当前类的实例(对象)
* 2. self: 引用当前类
*
* 范围解析符使用场景:
* 1. 类中: 引用本类的静态属性或方法 self::name; self::getName();
* 2. 类外: 访问类中的静态成员: className::property; className::method();
*/
class Demo3
{
//私有静态,外部不能访问
private static $name = 'lzh';
//类常量必须在声明时就初始化
const LEVEL = '高中部';
//受保护静态
protected static $exam = 'math';
public function getName()
{
return self::$name;
}
public static function getInfo()
{
return self::$name.'属于'.self::LEVEL.'考试内容:'.self::$exam;
}
}
class Demo4 extends Demo3
{
public static function getExam()
{
return self::$exam;
}
}
//不能访问到类中的私有静态
//但是公共静态可以访问
//echo Demo3::$name;
//可以通过对象来访问非静态方法
echo (new Demo3())->getName();
echo'<br>';
echo Demo3::LEVEL;//常量可以访问到
echo'<br>';
//通过类名来访问静态方法
echo Demo3::getInfo();
echo'<br>';
echo Demo4::getExam();
echo'<br>';
//子类的对象能访问父类中的公共方法
echo (new Demo4())->getName();
<?php
/**
* 静态成员的应用
*/
class Count
{
public static $count;
/*
* 构造方法在创建对象时自动调用,而静态成员不允许使用对象调用,
所以在构造方法中,不允许使用静态成中
*/
public static function add($count)
{
return self::$count += $count;
}
}
if (isset($_GET['start']) || isset($_GET['end']))
{
$start = (int)$_GET['start'];
$end = (int)$_GET['end'];
$total = 0;
for ($i=$start;$i<=$end;$i++)
{
$total = Count::add($i);
}
echo '总和是:'.$total;
}
?>
<div align="center">
<form>
开始<input type="text" name="start">
<hr/>
结束<input type="text" name="end">
</form>
<button onclick="add();">计算</button>
</div>
<!--接下来写一个提交js脚本-->
<script>
function add() {
document.forms[0].submit();
}
</script>