php mvc框架单入口,php框架codeigniter是如何实现mvc模式以及单一入口

然后我们通过$data= $this-》MSomemodel-》getvalue()执行了model中的一个方法,并从这个方法返回了数据,然后赋值给$data[‘data1’],$data是一个关联数组,我们通过这个数组向view视图文件传值,而不是使用常见的模板模式,这种方法更好地分离了mvc各个部分的处理,同时在性能方面有其独特的一面。

之后我们通过将$data数组传给views文件夹中的welcome.php文件,这个文件是常规的php和html混写的脚本,在这个脚本中可以利用传过来的$data数组输出信息,但是注意在view文件中输出信息的时候不必使用$data[‘data1’],而只需要echo $data1;即可。

基本的工作方式就是这样的,下面从代码级别来分析实现

代码分析

在CI中将Controller类作为超类来处理,也就是所有加载mvc实现模式的进程都从Controller类开始,所以我们忽略CI在加载到这个类的时刻前面的执行过程,而直接从Controller类所在的文件开始分析。

Controller类所在的文件位于system/libraries/Controller.php文件中。

在这个类中首先加载了所有必须的基础类,包括:‘Config’,‘Input’, ‘Benchmark’, ‘URI’, ‘Output’, ‘Language’, ‘Router’类。之后加载Roader类并执行了它的 _ci_autoloader()方法,这个类是mvc模式的核心,控制器中所有其他内容的加载都是通过它实现的,下面对其代码进行分析:

首先来看 _ci_autoloader()方法,这个函数实现了自动加载某些类库或者类,如果在你的应用程序中总是要用到某些类,但是你又不确保在CI中是否已经自动加载了这些类的话,你可以在config/autoload.php文件中设定要自动加载的library或者helper或者plugin的数组。具体请参考手册。

首先看看CI是如何加载libraries的,这个方法允许你在你的控制器的任何地方(通常是构造函数里)使用$this-》load-》library(“name”);来加载某个类,这个类可以是用户自定义的类也可以是系统的类库,用户自定义的类需要遵循CI的约定,具体信息见手册中的“创建你自己的类库 ”部分.library()方法以一个字符串或者一个类库名称的数组作为第一个参数,之后的处理将遍历然后加载所有的类,你可以通过第二个参数向要加载的类的构造函数传递参数,第三个参数允许你定义返回的对象的名称,后面的两个参数通常不使用,这个方法在简单判断了参数是否为空之后调用了方法_ci_load_class($class, $params = NULL, $object_name = NULL),这是一个非常复杂的函数,这个类加载第一个参数所指定的类,在这个类中进行了复杂的路径判断之后找到了所需要的类文件之后,调用了方法_ci_init_class($class, ‘’, $params, $object_name);这个类用来实例化一个类,如果在加载这个类的语句中包含了上述的第三个参数,则返回一个实例,以这个参数作为实例名,如果没有设置第三个参数,则返回一个以类名命名的实例名,这也是为什么前面的例子中在加载了model之后,直接将model类名作为一个对象使用的原因。

之后我们来看CI是如何加载模型的,这个方法允许你在控制器中使用$this-》load-》model($modelname,$name,$db_conn)加载模型,这三个参数分别是加载的模型的名称,加载后实例化的对象名称,是否自动连接数据库。后面两个参数可以省略,你可以讲多个模型一次载入,只需要将第一个参数设置成数组即可,这个方法首先将传过来的第一个参数以“\”分解成数组,这种机制允许你在模型中创建多层文件夹,更加合理地安排代码的分组,之后程序取出数组的最后一个元素作为要加载的类的名称,并根据路径寻找此类,之后包含此文件,并实例化此类,如果设置了第二个参数,则实例化到$name的对象中,否则默认以类名作为对象名进行实例化。

再来看CI是如何加载视图的,view($view, $vars = array(), $return = FALSE)方法的第一个参数是要加载的视图名称,第二个参数是要传给视图的变量值,第三个参数指定是否返回输出缓冲区的数据。这个方法将所有数组作为一个数组参数调用了_ci_load($_ci_data)方法,这个方法将传过来的变量数组通过extract()函数解析成符号表(也就是将键名当作变量名,值作为变量的值),并将这些变量缓存起来,以便可以再不同的视图中能够互相交流变量,也就是这个方法允许调用多次,为了在每次调用时都能自动加载已经传给前面视图的变量,将所有传给视图的变量都缓存在类的一个属性中,这样每次调用方法的时候都会获取所有的变量。之后加载这个视图文件,然后将其作为输出缓冲的一部分赋给全局变量$OUT,这个变量用来控制缓冲输出,这样做可以提高效率以及可以使调试的时间更准确。

其他的加载方法和上述的方法原理基本相同,只是根据情况有少许改变,CI在实现mvc模式的方法中将所有的文件都包含在控制器中,我们在包含了这些文件后,可以再控制器中自由使用这些对象和数据,然后最后通过缓冲输出类来输出所有的数据,虽然Loader这个类的结构看起来很复杂,但是其实它的实现时很简单的,其内部的代码原理基本相同,而且清晰明了,仔细看的话不难理解。

至此CI的mvc模式就讲解完毕了,第一次写这么长的教程,连自己都被写的迷迷糊糊,但是基本原理应该表达的还好吧,为了写N多原创教程,我要多多练习啊,如果有人没有看懂我在唠叨什么的话,那就联系我吧,我qq:676588498.

原文:http://www.cnblogs.com/mier/archive/2009/05/04/1448431.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
GeoPandas是一个开源的Python库,旨在简化地理空间数据的处理和分析。它结合了Pandas和Shapely的能力,为Python用户提供了一个强大而灵活的工具来处理地理空间数据。以下是关于GeoPandas的详细介绍: 一、GeoPandas的基本概念 1. 定义 GeoPandas是建立在Pandas和Shapely之上的一个Python库,用于处理和分析地理空间数据。 它扩展了Pandas的DataFrame和Series数据结构,允许在其中存储和操作地理空间几何图形。 2. 核心数据结构 GeoDataFrame:GeoPandas的核心数据结构,是Pandas DataFrame的扩展。它包含一个或多个列,其中至少一列是几何列(geometry column),用于存储地理空间几何图形(如点、线、多边形等)。 GeoSeries:GeoPandas中的另一个重要数据结构,类似于Pandas的Series,但用于存储几何图形序列。 二、GeoPandas的功能特性 1. 读取和写入多种地理空间数据格式 GeoPandas支持读取和写入多种常见的地理空间数据格式,包括Shapefile、GeoJSON、PostGIS、KML等。这使得用户可以轻松地从各种数据源中加载地理空间数据,并将处理后的数据保存为所需的格式。 2. 地理空间几何图形的创建、编辑和分析 GeoPandas允许用户创建、编辑和分析地理空间几何图形,包括点、线、多边形等。它提供了丰富的空间操作函数,如缓冲区分析、交集、并集、差集等,使得用户可以方便地进行地理空间数据分析。 3. 数据可视化 GeoPandas内置了数据可视化功能,可以绘制地理空间数据的地图。用户可以使用matplotlib等库来进一步定制地图的样式和布局。 4. 空间连接和空间索引 GeoPandas支持空间连接操作,可以将两个GeoDataFrame按照空间关系(如相交、包含等)进行连接。此外,它还支持空间索引,可以提高地理空间数据查询的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值