10月27日PHP加载类、设计模式(单例模式和工厂模式)、面向对象的六大原则

时间:2022-01-11 03:15:57

加载类可以使用include、require、require_once三种中的任意一种,每个关键字都有两种方法,但是这种方法的缺点是需要加载多少个php文件,就要写多少个加载类的方法。一般也就需要加载一两个类,所以这种写法很常用。

include  加载类的方法  中文意思是包含

require  也是加载方法

require_once  加载一次

//include("./Ren.class.php");
//include "./Ren.class.php"; //require("./Ren.class.php");
//require "./Ren.class.php"; //require_once("./Ren.class.php");
//require_once "./Ren.class.php";

自动加载类   要使用自动加载类,要满足下列2个条件,1.必须在同一个目录下  2.所有类文件的命名规则一样!

//使用条件:1.所有文件都放在同一个目录下;2.所有类文件的命名规则一致。
/*function __autoload($classname)//自动加载类的方法,classname代表类名。
{
require $classname.".class.php";//可以用第一种加载类的任意一种方法。
} 例如:网文件里加载类名为Ren的类
function __autoload($Ren)
{
  require $Ren.".class.php";//代表加载了class.php文件下的Ren类。类名后面加上文件名个文件格式。
} $r = new Ren();
*/
设计模式

1.单例模式
类的计划生育:类只能造出一个对象来,不能多造,更不能随便取造。

//从类外部控制
/*$dx;//顶一个变量$dx
class Dog//Dog类
{ }
if(empty($dx))//判断变量是否为空,为空返回true,不为空返回flase。
{
$dx = new Dog();//如果变量是空的就造一个对象给$dx。
}
else
{
$a = $dx;//如果不为空,就把$dx给$a。
}*/
//这样这个界面就不能多造了,但是别的类还可以继续多造,比如$b=new Dog(),$c=new Dog().从类外部控制不能控制全部的,所以要转到内部控制。

//从类内部控制

内部控制的思路

1.让该类在外界无法造对象,使用private.
2.让外界可以造一个对象,做一个静态方法返回对象
3.在类里面通过静态变量控制返回对象只能是一个

class Dog
{
  state $dx;   public $test;   private function __construct()//为了不让外界访问,先把访问模式变为私有的private,外界无法new对象了。造下面的DuiXiang方法内部访问,返回对象。   {   }   static function Duixiang()//做一个方法,调一下就返回一个对象。外部无法调用此方法,先把此方法变为静态的,不用造对象访问,直接用类名来调用。但是类名每调用一次都会返回一个对象,还是起不到目标效果。做一个成员变量$dx,用来存储对象。
  {
    //return new Dog();//返回一个对象
    if(empty(self::$dx))//先判断$dx这个变量是否为空
    {
      self::$dx = new Dog();//如果变量$dx是空的,就造一个对象给$dx
    }
    return self::$dx;//如果变量$dx不为空,就不用造了,什么都不执行,直接返回$dx。
  } } $a = Dog::DuiXiang();//造一个对象$a $b= Dog::DuiXiang();//造一个对象$b $b->test="hello"; echo $a->test;//输出结果为hello和$b的一样。 虽然造了两个对象,但是是同一个对象,无论调多少,也都是一个。

工厂模式     工厂模式就是指有一个工厂类,根据给的参数的不同生产出不同的对象。一般来说生产的对象有一个相同父类的,就比如说上面的做的那些类,有一个YunSuan的父类,Jia、Jian、Cheng三个子类。然后工厂类就返回这三个子类的任意一个,根据参数的不同返回相应的参数。

写一个父类用子类去继承父类比较安全

abstract class Yunsuan//做一个抽象类
{
public $a;//变量a
public $b;//变量b
function Suan()//方法Suan
{ }
} class Jia extends Yunsuan//做一个YunSuan的子类
{
function Suan()//对Suan的方法重写
{
return $this->a+$this->b;
}
} class Jian extends Yunsuan//修改减法的功能只需要修改这个文件就可以
{
function Suan()
{
return $this->a-$this->b;
}
} class Cheng extends Yunsuan//需要扩展功能的话直接再新写一个文件就可以,去掉一个功能直接删除相应文件就可以。
{
function Suan()
{
return $this->a*$this->b;
}
}
//$j = new Jia9);//箱实现加法就直接写一个加法对象,调用里面的Suan方法就可以了。
//$j->Suan(); //工厂类,生产对象。给不同的参数,生产不同的对象。
class GongChang
{
static function ShengChan($f)//为了比较方便调用,做成静态的,直接用类名调用。
{
switch($f)
{
case "+"://如果是+,就返回Jia的对象。
return new Jia;
break;
case "-":
return new Jian;//如果是-,就返回Jian的对象
break;
case "*":
return new Cheng;
break;
}
}
} $r = GongChang::ShengChan("+");//实行加法运算,就传一个“+”到类GongChang里面,然后就会返回一个new Jia,也就是加法的对象对象(YunSuan的子类)
$r->a=10;
$r->b=5;
echo $r->Suan();

面向对象的六大原则

OOP基本上有6大原则,而实际上都是互补的,也就是说一些原则需要利用另一些原则来实现自己。6大原则如下:

1) Open-Close Principle(OCP),开-闭原则,讲的是设计要对扩展有好的支持,而对修改要严格限制。这是最重要也是最为抽象的原则,基本上我们所说的Reusable Software既是基于此原则而开发的。其他的原则也是对它的实现提供了路径。

2) Liskov Substituition Principle(LSP),里氏代换原则,很严格的原则,规则是“子类必须能够替换基类,否则不应当设计为其子类。”也就是说,子类只能去扩展基类,而不是隐藏或覆盖基类。

3) Dependence Inversion Principle(DIP),依赖倒换原则,“设计要依赖于抽象而不是具体化”。换句话说就是设计的时候我们要用抽象来思考,而不是一上来就开始划分我需要哪些哪些类,因为这些是具体。这样做有什么好处呢?人的思维本身实际上就是很抽象的,我们分析问题的时候不是一下子就考虑到细节,而是很抽象的将整个问题都构思出来,所以面向抽象设计是符合人的思维的。另外这个原则会很好的支持OCP,面向抽象的设计使我们能够不必太多依赖于实现,这样扩展就成为了可能,这个原则也是另一篇文章《Design by Contract》的基石。

4) Interface Segregation Principle(ISP),接口隔离原则,“将大的接口打散成多个小接口”,这样做的好处很明显,我不知道有没有必要再继续描述了,为了节省篇幅,实际上我对这些原则只是做了一个小总结,如果有需要更深入了解的话推荐看《Java与模式》,MS MVP的一:本巨作!^_^

5) 单一职责:一个类的功能尽量单一,降低耦合

6) Law of Demeter or Least Knowlegde Principle(LoD or LKP),迪米特法则或最少知识原则,这个原则首次在Demeter系统中得到正式运用,所以定义为迪米特法则。它讲的是“一个对象应当尽可能少的去了解其他对象”。也就是又一个关于如何松耦合(Loosely-Coupled)的法则。

好了,以上是6大原则(或法则)的介绍,对这些原则的深入研究正是如何得到设计模式的道路。在进行了深入了解后我们就可以开始看看设计模式了,设计模式正是对这些法则的应用,著名的设计模式有*(Gang of Four,GoF)的23个模式,除此之外还有很多其他的一些著名模式,大家可以慢慢研究,如果能自己产出一两个模式的话那就太好了,证明你也是高手了!^_^

10月27日PHP加载类、设计模式(单例模式和工厂模式)、面向对象的六大原则的更多相关文章

  1. 2016年10月27日 星期四 --出埃及记 Exodus 19:12

    2016年10月27日 星期四 --出埃及记 Exodus 19:12 Put limits for the people around the mountain and tell them, `Be ...

  2. 2016年10月12日--string、Math类、Random随机数、DateTime、异常保护

    string string.length; //得到string长度 string.Trim(); //去掉string前后的空格 string.TrimStart(); //去掉string前的空格 ...

  3. EditPlus 3.7.1186 中文版(10月27日更新)重大性能改进,推荐更新!

    3.7.* 版的 EditPlus 存在性能问题:加载行数比较多的文档时,要等很长的时间.加载一个十几兆的文本文件,可能需要等十几秒.在编辑窗口内翻页也会有明显的迟滞感.而此前的 3.6 版本并非如此 ...

  4. 10月27日Java整理

    实验一:凯撒密码 import java.util.Scanner; //zhanxinwu,October,25,2016 public class Addmi { public static vo ...

  5. 2016年10月27日--css样式表

    CSS样式表 样式表分类 1.内联样式表 和html联合显示,控制精确,但是可重用性差,冗余多. !doctype html> <html> <head> <met ...

  6. 2016年10月16日 星期日 --出埃及记 Exodus 18&colon;27

    2016年10月16日 星期日 --出埃及记 Exodus 18:27 Then Moses sent his father-in-law on his way, and Jethro returne ...

  7. 成都Uber优步司机奖励政策(3月27日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  8. 背水一战 Windows 10 &lpar;11&rpar; - 资源&colon; CustomResource&comma; ResourceDictionary&comma; 加载外部的 ResourceDictionary 文件

    [源码下载] 背水一战 Windows 10 (11) - 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件 作者 ...

  9. tomcat 5&period;5 动态加载类

    转载于:http://www.itxuexiwang.com/a/javadianzishu/tomcat/2016/0225/161.html?1456480735 开发使用的是tomcat5.5. ...

随机推荐

  1. Bash&colon;-&colon;-定义空变量作为输出结合换行符&bsol;n和column输出

    RET="" declare -a HOST=() declare -a ALL_SVR=() declare -a FREESVR=() ;i<${#_ALL_AGENT_ ...

  2. Python标准库07 信号 &lpar;signal包,部分os包&rpar;

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在了解了Linux的信号基础之后,Python标准库中的signal包就很容易学习 ...

  3. 一、Android NDK编程预备之Java jni简介

    转自:  http://www.eoeandroid.com/thread-264384-1-1.html 游戏开发 视频教程 博客 淘帖     论坛›eoe·Android应用开发区›Androi ...

  4. Python命令行参数sys&period;argv&lbrack;&rsqb;

    学习C语言的时候就没弄明白命令行参数的用法,在学习Pyton 的时候又遇到了命令行参数,在这里稍微学习了一下,稍微明白了一些在这里做个记录方便后面回顾复习. Sys.argv[]是用来获取命令行参数的 ...

  5. ubuntu 设置网卡为混杂模式 以及网络配置命令

    1. ifconfig eth0 promisc 设置eth0为混杂模式. ifconfig eth0 -promisc 取消它的混杂模式 botnet@botnet-virtual-machine: ...

  6. Android应用开发基础篇(14)-----自定义标题栏

    一.概述 每一个应用程序默认的标题栏(注意与状态栏的区别)只有一行文字(新建工程时的名字),而且颜色.大小等都是固定的,给人的感觉比较单调.但当程序需要美化的时候,那么修改标题栏是就是其中一项内容,虽 ...

  7. PHP中的函数声明与使用

                                               函数 1.  函数名是标识符之一,只能有字母数字下划线,开头不能是数字:      函数名的命名,必须符合&quo ...

  8. 在SOUI中使用动态多语言切换

    动态语言切换是很多国际化产品的需求,SOUI之前的版本支持静态多语言翻译,通过在程序启动时设置好语言翻译模块,在程序中打开的UI都会自动调用该翻译模块进行文字翻译,但是不支持运行进语言切换. 最近几个 ...

  9. Java面向对象概述和三大特性

    Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心.围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范.继承是类与类之间联系的一种形式.而多态 ...

  10. virtualbox下centos虚拟机安装,并网卡配置桥接方式上网,使得和host可以互Ping通。

    见:http://www.cnblogs.com/taoshiqian/p/7615993.html 注意: 1.host 主机什么都不要处理 2.将virtualbox 的对应虚拟机网络设置桥接 3 ...