php面向对象开发学习笔记

 更新时间:2016年11月25日 15:00  点击:1992
面向对象程序设计(英语:Object-oriented programming,缩写:OOP),指一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的集合。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性

1.在定义对象方法的时候,虽然不用在前面写public默认为公共方法,但是建议写上。

php面向对象第一天

1.什么是面向对象


要素:抽象性,封装性,共享性,强调对象结构而不是程序结构。

什么是类?
可以理解成一个功能集合菜单,我们通过类来实现生成我们的方法。
例:一台电脑
类:显示器/键盘/主机...的集合(封装)。
对象:显示器/键盘/主机……其中之一,拥有自己的独有功能。
属性:电脑。
方法:提高功能,看电影,玩游戏,编程,上网……。

 

2.使用class创建一个类
有了类才能有方法。
格式:
class 方法名 {
......
}

成员属性:自定义变量(一个名而已)。
成员方法:自定义功能。

 

3.类的成员属性和成员方法
注意:使用public来定义成员属性不要用var。

实例:

 代码如下 复制代码
class MyPc { //声明一个类,定义一个方法MyPc。
public $name; //成员属性。
var $price; //成员属性
function vod() { //成员方法,实现返回字符串功能。
return "test";
}
}


4.使用new函数对象实例化
格式:new 对象名(参数)
实例1:

 代码如下 复制代码

class MyPc { //声明一个类,定义一个方法MyPc。
public $name; //成员属性。
var $price; //成员属性
function vod() { //成员方法,实现返回字符串功能。
return "test";
}
}

$pc1 = new Mypc(); //实例化
$pc1 -> name;


实例2:

 代码如下 复制代码

<?php
class MyPc {

 var $key;
 public $name;

 function vod() {
  echo "hello";
 }

}

$pc1 = new MyPc();
$pc1->key = "10101010";

echo $pc1->key;
?>


 

php面向对象第二天


1.创建一个和多个对象。
2.对象中的 $this 关键字。
3.初始化对象 __construct()
4.析构函数 __destruct()

-----------------------------------------

1.创建一个和多个对象
创建一个和多个对象我们只需要多次使用 new 函数,对类进行实例化。
实例:

 代码如下 复制代码

class MyPc {
public $name;
public $price;

function vod() {
return "播放电影";
}
....
}

$pc1 = new MyPc();
$pc2 = new MyPc();
$pc3 = new MyPc();

 

2.对象中的 $this 关键字
$this 关键字是用来访问当前对象中的对象属性和对象方法的系统变量。
范围:该类当中。
实例:

 代码如下 复制代码
class MyPc {
public $name;--------
public $price;      |
                    |
function vod() {    |
$this->name;<--------
}
....
$this->vod(); //这样输出调用的就是 public $name;
....
}

实例2:

 代码如下 复制代码

<?php
class MyPc {
 public $name;

 function vod() {
  return $this->name . " 正在播放 未来战警";
 }
 function game() {
  return $this->vod() . " 正在运行 魔兽世界";
 }

}
$pc1 = new MyPc();
$pc2 = new MyPc();

$pc1->name = "1号计算机";
$pc2->name = "2号计算机";
echo $pc1->vod() . "<br />";
echo $pc2->game() . "<br />";
?>


 

3.初始化对象 __construct()
初始化相当于就是预先预定好某个成员属性的初始值。

格式:
class MyPc {
function __construct() {
初始化操作
}
}

实例:

 代码如下 复制代码

<?php

class MyPc {
 public $name;

 function __construct($name = "") { //初始化。
  $this->name = $name; //把初始化内容第四行的 $name = "" 赋值给 $this 取到的第三行的 public $name;。
 }

 function vod() {
  return $this->name . " 正在播放 未来战警";
 }

 function game() {
  return $this->vod() . " 正在运行 魔兽世界";
 }

}
$pc1 = new MyPc("1号计算机"); //这里进行初始化。
$pc2 = new MyPc("2号计算机");

echo $pc1->vod() . "<br />";
echo $pc2->game() . "<br />";
?>

4.析构函数 __destruct()
能够在对象释放时自动被调用的方法,被成为析构函数,也能理解为垃圾回收机制。
规则:后进先出,先实例化后释放,最后实例化调用,最先释放。
最后被调用。

实例:

 代码如下 复制代码

<?php

class MyPc {
 public $name;

 function __construct($name = "") {
  $this->name = $name;
 }

 function vod() {
  return $this->name . " 正在播放 未来战警";
 }

 function game() {
  return $this->vod() . " 正在运行 魔兽世界";
 }

 function __destruct() { //后进先出。
  echo "<br />垃圾回收机制:" . $this->name . "<br />";
 }

}
$pc1 = new MyPc("1号计算机");
$pc2 = new MyPc("2号计算机");

echo $pc1->vod() . "<br />";
// $pc1 = null; //这里是当特殊需要执行完毕立即回收内存的话,可以使用null。
echo $pc2->game() . "<br />";
?>

php面向对象第三天


类的封装和应用

1.封装关键字:public , protected , private。
2.封装相关函数:__set() , __get()。

-----------------------------------------------

1.封装关键字:public , protected , private
封装是把一些相关的属性和行为隐藏起来,从而得到保护和安全。

封装关键字
public:表示全局,类内部外部子类都可以访问。
protected:表示受保护的,只有本类或子类或父类中可以访问。
private:表示私有的,只有本类内部可以使用。[重要:这个关键字在使用时,调用私有属性或方法,只能在本类调用,感觉就像多一道工序,做一个跳板。详见实例2]

       public     protected     private
 全局     1           0            0
继承类    1           1            0
 本类     1           1            1

实例:

 代码如下 复制代码

<?php
class MyPc {
 public $name; //公共属性
 protected $price; //保护属性

 private function vod() { //私有属性
  $this->name;
 }
  . . .
 }
?>

实例2:

 代码如下 复制代码

<?php

class MyPc {
 private $name;
 function __construct($name = "") {
  return $this->name = $name;
 }
 private function open() {
  return $this->name . "---打开电源,正在开机";
 }
 public function ok() {
  return $this->open() . "---OK";
 }
}
$pc = new MyPc("我的电脑");
echo $pc->ok();
?>

 


分装相关函数: __set() , __get() 作用:操作私有属性或方法。
__set():取得当前类中封装过的私有属性或私有方法,重新执行或赋值操作。
格式:__set($n,$v)

__get():取得(间接访问防止裸输出)当前类中封装过的属性或方法并转换成公有属性。

__get/__set实例:

 代码如下 复制代码

<?php

class MyPc {
 private $name;
 public function __construct($name = "") {
  return $this->name = $name;
 }

 public function __get($name) {
  return $this->name . "__get";
 }
 public function __set($n, $v) { //$n对应对象属性$name,$v对应倒数第三行__set。
  $this-> $n = $v;
 }
 private function open() {
  return $this->name . "---打开电源,正在开机";
 }
 public function ok() {
  return $this->open() . "---OK";
 }
}
$pc = new MyPc("我的电脑");
$pc->name = "__set";
echo $pc->name;
?>

类的继承和应用

1.继承关键字:extends。
2.PHP继承的规则。
3.基类方法重载和基类方法访问。

------------------------------------------------

1.继承关键字:extends
PHP类的继承,我们可以理解成共享被继承类(基类)的类容。
注意:PHP是单一继承。

 

2.格式

 代码如下 复制代码

class MyPc {
...
}

class Home extends MyPc {
...
}

3.基类方法重载和基类方法访问
格式:基类名::原始基类方法名称

 

4.实例
继承:

 代码如下 复制代码

<?php
class Root {
 public function print1() {
  return "Root_print";
 }
}

class Son extends Root {
 public function print2() {
  return "Son_print";
 }
}

$p = new Son();
echo $p->print1();
?>

重载:
如果基类的某个方法需要在派生类中加强,那么可以用重载功能

 代码如下 复制代码

<?php

class Root {
 public function print1() {
  return "Root_print";
 }
}

class Son extends Root {
 public function print1() {
  return Root :: print1() . "<br />Son_print";
 }
}

$p = new Son();
echo $p->print1();
?>


 

类的抽象方法和类

其实也可以理解为,这是一个规范。在类的开头定义一个抽象类和方法,然后在下面的类继承抽象类,这样可以强制规范以下派生类的方法命名(就只是在抽象类中定义的抽象方法名,还可自己增加,但是主要的不能修改)。

1.抽象关键字:abstract。
2.抽象方法和抽象类的定义。
3.抽象类和方法使用规则。

-----------------------------------------

1.抽象关键字:abstract
抽象就是无法确切的说明,但又有一定的概念或者名称。

 

2.抽象方法和抽象类的定义
一个类至少有一个方法是抽象的,我们称之为抽象类。
所以如果定义抽象类首先定义抽象方法。
格式:
abstract class class1 {

abstract function fun1();

...
}
注意:1.类中至少有一个抽象方法。;2.抽象方法不允许有{}。;3.抽象方法前面必须加 abstract 。

 

3.抽象类和方法使用规则
抽象类特点:
1.不能被实例化,只能被继承。
2.继承的派生类当中要把所有抽象方法重载才能被实例化。
格式(不可以实例化):
abstract class cl1 {

abstract function fun1();

...
}

格式(可以实例化):
class cl2 extends cl1 {

function fun1() { //重载抽象方法
}
...
}

---------------------------------------------------
实例:

 代码如下 复制代码

<?php
abstract class ChouXiang {
 abstract function fun1();

}

class PaiShengLei extends ChouXiang {
 public function fun1() { //重载
  echo "test";
 }
}

$p = new PaiShengLei();
$p->fun1();
?>

 

 

php中类的常用关键字包括有:锁(fianl)、有点类似与this关键字(self)、静态属性(static)、常量关键字(const)下面我来给大家整理整理。

类中的常用关键字

1.fianl:锁
2.self:有点类似与this关键字
3.static:静态属性
4.const:常量关键字


1.关键字:fianl

用来定义类和方法的一个重要关键字,当定义类的时候该类不能被继承,用来定义方法的时候该方法不能被重载。

1. final不成修饰成员属性(类中常不是用这个关键字)

2. final只能修饰类和方法

作用:

使用final修饰的类 不 能被子类继承

使用final修饰的方法不能被子类去覆盖

用来限制类不被继承,方法不被覆盖就使用fianl


类使用 final 关键字的例子:

final class Person
{
    ......
}

final 定义的类被继承时会提示如下错误:

Fatal error: Class Student may not inherit from final class (Person) in ...

方法使用 final 关键字的例子:

class Person
{
    final function say()
    {
        ......
    }
}

Example #1 Final 方法示例

 代码如下 复制代码

<?php
class BaseClass {
   public function test() {
       echo "BaseClass::test() calledn";
   }
  
   final public function moreTesting() {
       echo "BaseClass::moreTesting() calledn";
   }
}

class ChildClass extends BaseClass {
   public function moreTesting() {
       echo "ChildClass::moreTesting() calledn";
   }
}
// 产生 Fatal error: Cannot override final method BaseClass::moreTesting()
?>

Example #2 Final 类示例

 代码如下 复制代码

<?php
final class BaseClass {
   public function test() {
       echo "BaseClass::test() calledn";
   }
  
   // 这里无论你是否将方法声明为final,都没有关系
   final public function moreTesting() {
       echo "BaseClass::moreTesting() calledn";
   }
}

class ChildClass extends BaseClass {
}
// 产生 Fatal error: Class ChildClass may not inherit from final class (BaseClass)
?>

2.关键字:self

在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就必须使用操作符::,反之如果被引用的变量或者方法没有被声明成const或者static,那么就必须使用操作符->。

另外,如果从类的内部访问const或者static变量或者方法,那么就必须使用自引用的self,反之如果从类的内部访问不为const或者static变量或者方法,那么就必须使用自引用的$this


格式:

self::类内部成员(属性或者方法)
|| 等价于
类名::类内部成员(属性或者方法)

注意:因为没有数理化类访问内部属性或方法是没有意义的,所以self一般用来访问类中的:静态成员,常量,其他定义的内容。

 

3.关键字:static

内存优化,用来定义静态属性或方法,可以在类未被实例化时就能使用。静态属性单独占用内存,而不会因创建多个对象而重复占用内存。

格式:
class class1 {
static $name;
static function fun1 {
...
}
}

静态成员的访问(类内部):
self::静态成员
类名称::静态成员

静态成员的访问(类外部):
类名称::静态成员


4.关键字:const

用来定义类中的常量,只能修饰类当中的成员属性。
格式:

class class1 { //建议用大写定义,不使用$符号。
const NAME;
...
}

看个PHP const小例子吧:

 代码如下 复制代码

< ?php  
class say_const{  
const CHARSET="中国";  
publice function say_hello()
{  
echo slef::CHARSET;  
}  
}  
$const1=new say_const()  
$const1->say_hello();  
?>  

原理是在函数执行前先设定一个时钟信号,如果函数的执行超过规定时间,信号会被触发,信号处理函数(sig)会抛出一个异常,被外层代码捕获。这样就跳出了原来函数的执行,接着执行下面的代码。如果函数在规定的时间内,时钟信号不会触发,在函数结束后清除时钟信号,不会有异常抛出

到php官方查看此函数说明

pcntl_alarm (PHP 4 >= 4.3.0, PHP 5)

pcntl_alarm — 为进程设置一个alarm闹钟信号

说明¶int pcntl_alarm ( int $seconds )

创建一个计时器,在指定的秒数后向进程发送一个SIGALRM信号。每次对 pcntl_alarm()的调用都会取消之前设置的alarm信号。

参数¶seconds 等待的秒数。如果seconds设置为0,将不会创建alarm信号。

返回值¶返回上次alarm调度(离alarm信号发送)剩余的秒数,或者之前没有alarm调度(译注:或者之前调度已完成) 时返回0。


实例

 代码如下 复制代码

<?php
declare(ticks = 1);
function a()
{
    sleep(10);
    echo "a finishin";
}
function b()
{
    echo "Stopn";
}
function c()
{
    usleep(100000);
}
 
function sig()
{
    throw new Exception;
}
 
try
{
    //设置一个闹钟信号为一秒钟执行一次
    pcntl_alarm(1);
    //安装闹钟信号,并绑定callback
    pcntl_signal(SIGALRM, "sig");
    a();
    //取消闹钟信号
    pcntl_alarm(0);
}
catch(Exception $e)
{
    echo "timeoutn";
}
 
b();
a();
b();


附,pcntl扩展安装

pcntl扩展可以支持php的多线程操作.

原本需要重新编译PHP的后面configrue提示加上--enable-pcntl

为了省事直接编译算鸟.

 代码如下 复制代码
# cd /usr/local/src/php-5.2.6/ext/pcntl
# phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config
# make && make install

pcntl.so  加到php.ini中OK

在php中define()与const()都可以定义常量,那么define()与const的区别到底在哪里呢,这个很多程序员都不明白,下面我给大家介绍一些关于此函数用法比对吧。

define()与const的区别:

define() 在执行期定义常量,而 const 在编译期定义常量。这样 const 就有轻微的速度优势(即性能稍微好点),但不值得考虑这个问题,除非你在构建大高并发系统。

define() 将常量放入全局作用域,即使在命名空间中使用define方法定义常量也属于全局作用域的。不能使用 define() 定义类常量(类常量使用const定义),命名空间作用域内的常量使用const定义如: namespace const ABC=’100′;。

define() 允许你在常量名和常量值中使用表达式,而 const 则都不允许。 这使得 define() 更加灵活。
define() 可以在 if() 代码块中调用,但 const 不行。

在同一作用域下,define()常量名和const定义的常量名不能相同.
const可以定义类常量和命名空间常量. 如

namespace abc; const ABC = ‘a’; class hello { const C_NUM = 8; }

 代码如下 复制代码

if (...) {
    const FOO = 'BAR';    // invalid
}
 
but
 
if (...) {
    define('FOO', 'BAR'); // valid
}

4、const采用一个普通的常量名称,define可以采用表达式作为名称。

 代码如下 复制代码


const  FOO = 'BAR';
 
for ($i = 0; $i < 32; ++$i) {
    define('BIT_' . $i, 1 << $i);
}

5、const只能接受静态的标量,而define可以采用任何表达式。

 代码如下 复制代码

const BIT_5 = 1 << 5;    // invalid
 
but
 
define('BIT_5', 1 << 5); // valid

6、const 总是大小写敏感,然而define()可以通过第三个参数来定义大小写不敏感的常量

 代码如下 复制代码

define('FOO', 'BAR', true);  www.111cn.net

echo FOO; // BAR
echo foo; // BAR

总结:
使用const简单易读,它本身是一个语言结构,而define是一个方法,用const定义在编译时比define快很多。

在php中while(list($key,$val)=each($result)) 是就读取$result数组值并循环获取数组内容赋值给$key,$val哦。

 代码如下 复制代码


echo "类CAR中的所有方法名为:";

echo "<p>";

$result=get_class_methods("CAR"); //获取类CAR中的方法名get_class_methods()

while(list($key,$val)=each($result))   //循环获取数组内容

{

  echo "方法$key=>$val";

  echo "<p>";

}

list() 函数用数组中的元素为一组变量赋值。

注意,与 array() 类似,list() 实际上是一种语言结构,不是函数

[!--infotagslink--]

相关文章

  • java8如何用Stream查List对象某属性是否有重复

    这篇文章主要介绍了java8如何用Stream查List对象某属性是否有重复的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-11
  • R语言 如何删除指定变量或对象

    这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
  • JavaScript预解析,对象详解

    这篇文章主要介绍了JavaScript预解析,对象的的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助...2021-11-10
  • 如何在Spring WebFlux的任何地方获取Request对象

    这篇文章主要介绍了如何在Spring WebFlux的任何地方获取Request对象,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下...2021-01-26
  • 牛叉的Jquery――Jquery与DOM对象的互相转换及DOM的三种操作

    只有jQuery对象才能调用jQuery类库的各种函数,同样有些dom对象的属性和方法在jQuery上也是无法调用的,不过基本上jQuery类库提供的函数包含了所有的dom操作。这就需要我们知道如何将jQuery对象和DOM的相互转换的方法。1...2015-10-30
  • js如何打印object对象

    js调试中经常会碰到输出的内容是对象而无法打印的时候,光靠alert只能打印出object标示,却不能打印出来里面的内容,甚是不方便,于是各方面整理总结了如下一个函数,能够将数组或者对象这类的结果一一打印出来,具体代码如下: fu...2015-10-21
  • php上传图片学习笔记与心得

    我们在php中上传文件就必须使用#_FILE变量了,这个自动全局变量 $_FILES 从 PHP 4.1.0 版本开始被支持。在这之前,从 4.0.0 版本开始,PHP 支持 $HTTP_POST_FILES 数组。这...2016-11-25
  • Smarty模板学习笔记之Smarty简介

    1、简介Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目...2014-05-31
  • 替换json对象中的key最佳方案

    本文给大家介绍如何替换json对象中的key,通过实例代码给大家介绍key的替换方法,代码也很简单,需要的朋友参考下吧...2021-06-02
  • javascript self对象使用详解

    这篇文章主要介绍了javascript self对象使用详解的相关资料,需要的朋友可以参考下...2016-10-20
  • ActiveX部件不能创建对象:dm.dmsoft代码:800A01AD

    vbs调用插件报:ActiveX部件不能创建对象,代码:800A01AD,一般是因为病毒导致dll文件丢失或者64系统问题导致,需要的朋友可以参考下...2020-06-30
  • 理解JavaScript事件对象

    这篇文章主要为大家介绍了JavaScript事件对象,了解JavaScript事件...2016-01-26
  • php Observer观察者模式之学习笔记

    当我们在星际中开地图和几家电脑作战的时候,电脑的几个玩家相当于结盟,一旦我们出兵进攻某一家电脑,其余的电脑会出兵救援。 那么如何让各家电脑知道自己的盟友被攻击了...2016-11-25
  • Xml中使用foreach遍历对象实现代码

    这篇文章主要介绍了Xml中使用foreach遍历对象实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-12-04
  • 解决SpringCloud Feign传对象参数调用失败的问题

    这篇文章主要介绍了解决SpringCloud Feign传对象参数调用失败的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-24
  • JS实现简单面向对象的颜色选择器实例

    这篇文章主要介绍了JS实现简单面向对象的颜色选择器,以完整实例形式分析了JavaScript基于面向对象实现颜色选择器的具体步骤与实现技巧,需要的朋友可以参考下...2016-04-23
  • vue - props 声明数组和对象操作

    这篇文章主要介绍了vue - props 声明数组和对象操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-30
  • 对象题目的一个坑 理解Javascript对象

    这篇文章主要介绍了Javascript对象,特别为大家分享了对象题目的一个坑,提供了解题思路,感兴趣的小伙伴们可以参考一下...2015-12-24
  • JavaScript Blob对象原理及用法详解

    这篇文章主要介绍了JavaScript Blob对象原理及用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-14
  • Bootstrap媒体对象的实现

    在web页面中,图片居左,内容居右排列,是非常常见的效果,它也就是媒体对象,它是一种抽象的样式,可以用来构建不同类型的组件。本文给大家介绍Bootstrap媒体对象的实现,感兴趣的朋友一起学习吧...2016-05-04