十.PHP面向对象
程序员文章站
2024-03-17 16:26:52
...
一.继承
总结:
- public和protected成员可以被子类继承,private不能被继承。
- 一类最多同时继承一个类,不能同时继承多个类。
- 在子类中可以通过(父类名::父类的方法名或parent::父类的方法名)方法来访问父类的方法,前提是:父类的方法能够被继承才能访问(public、protected)。
- 如果子类和父类拥有相同的方法名,子类的会重写(覆盖)父类的方法。
例子:
<?php
class Student
{
public $name;
protected $age;
protected $class;
public funciton showName () {
echo $this->name;
}
}
class Samson extends Student
{
private $core;
protected $phoneNum;
public function __construct ($name) {
$this->name = $name;
}
}
$bestStu = new Samson('samson');
$bestStu->showName();
?>
注意:PHP并不像其他语言一样的通过参数列表来实现重载。
- 属性的重载是通过__set __get __isset __unset这些魔术方法实现的。
- 方法的重载是通过__call这个魔术方法实现的。
例:
<?php
class Math
{
public funtion add($num1, $num2) {
return $num1 + $num2;
}
public funtion addMore($num1, $num2, $num3) {
return $num1 + $num2 + $num3;
}
public function __call($name, $arguments) {
if ($name == 'getResult') {
if (count($arguments) == 2) {
return $this->add($arguments[0], $arguments[1]);
} else if ((count($arguments) == 3) {
return $this->addMore($arguments[0], $arguments[1], $arguments[2]);
}
} else {
echo '访问的方法不存在';
}
}
}
$math = new Math();
echo $math->getResult(1, 2);
echo $math->getResult(1, 2, 3);
?>
二.抽象类
- 一旦使用abstract将类的某个方法声明为抽象方法了,这个类就是一个抽象类了,必须在类名前面加上abstract。
- 抽象方法不能有函数体。
- 抽象类不能实例化,只能被继承。
- 一个类一旦有抽象方法,就必须将类声明为抽象类。
<?php
adstract class Ainimal
{
abstract public function getName();
}
class Cat extends Ainimal
{
public funtion getName() {
echo '小猫';
}
}
$cat = new Cat();
$cat-> getName();
?>
三.接口
定义:接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,再根据具体情况把这些方法写出来。(接口是更加抽象的抽象类,抽象类里的方法可以有方法体,接口里的所有方法都没有方法体。接口体现了程序设计的多态和高内聚 , 低偶合的设计思想。)
注意:
- 接口不能被实例化。
- 接口中可以有属性,但只能是常量 ,默认是public, 但不能用public 显式修饰。
- 接口中的方法都必须是public的,默认就是public。
- 一个类可以实现多个接口,逗号隔开 。
- 一个接口不能继承其它的类,但是可以继承别的接口。
PHP的继承是单继承,也就是一个类最多只能有一个父类,这种单继承的机制可保证类的纯洁性,比c++中的多继承机制简洁。 但是不可否认,对子类功能的扩展有一定影响.所以我们认为: (1)实现接口可以看作是对 单继承的一种补充,还有一点,继承是层级式的,不太灵活。图示,这种结构修改某个类就会打破这种继承的平衡,而接口就没有这样的麻烦,因为它只针对实现接口的类才起作用。
四.final
使用情形:
- 不希望父类的某个方法被子类重写(override时,可以用final关键字修饰。
- 不希望类被继承时,可以用final修饰。
注意:
- final不能够修饰成员属性(变量) 。
- final 方法不能被重写,但可以被继承. 一般来说,final 类中不会出现final 方法,因为final类都不能被继承,也就不会去重写override final类的方法了。
- final 类 是可以被实例化的。
final class 类名{ //final 类,该类不能被继承 }
class 类名{ final 修饰符 function 函数名(参数列表){} // final 方法, 不能被重写 }
例子:
<?php
class Abc1{
final public function test(){
echo 'hello,ok';
}
}
class Abc2 extends Abc1{
public function test2(){
echo 'hello,ok2';
}
}
$x=new Abc2();
$x->test2();
echo '<br/>';
//调用父类的final方法
$x->test();
?>
五.const
基本用法:
- const 常量名=值。
- 访问: 类名::常量名; 或 self::常量名 接口名::常量名 。
- 常量名应全部大写,并且前面不要有$
const RATE = 3.1415926;
class Person {
const ARRAR = array(10, 90);
}
$p = new Person ();
echo Person::ARRAR[1];
六.对象遍历
1.语法
foreach($对象 as $key => $val)
{
echo "$key = $val";
}
注意:在类外部遍历时,只能遍历到public 属性。
2.php内置标准类
不想定义一个类,可以考虑使用 PHP内置标准类 stdClass [standard标准]。
3.对象序列化和反序列化
前提:
一个php脚本执行完毕,里面的变量会被释放掉。
<?php
class Cat{
public $name = '女王陛下';
public $food = '鱼';
public funciton skill() {
echo "抓耗子";
}
}
$cat = new Cat();
//对象转换成字符串
$catStr = serialize($cat);
file_put_contends('./cat,txt', $catStr);
?>
<?php
$cat = file_get_contents('./cat.txt');
//反序列化,字符串转换成对象
$cat= u'nserialize($cat);
file_put_contends('./cat,txt', $cat);
?>
上一篇: 水仙花数
下一篇: Python进阶 open函数