最近开发一套自己的框架,开发了一个多月,已传到git,学到了挺多,系列文章我会慢慢写挺多

这里先讲大致框架多用到的某些函数,我这里先列举一部分,网上对函数的定义,参数说明等,我就不照搬了,记录自己的理解和测验:

一  get_called_class

谁调用就显示调用的类名(包括继承等),框架中用到了很多,在创建驱动等方面用到了很多。

举例:

class foo {
static public function test() {
var_dump(get_called_class());
}
}
class bar extends foo {
}
foo::test();
bar::test();
输出:
string() "foo"
string() "bar"

二   func_get_args

获取真实传递的参数,不要忽略了,有些函数有默认值的,这些不算在func_get_args内,在框架中用到的也颇多。主要用于未知用户键入的参数以及多变化的处理情况。

create($name, $type = 'php'){
Var_dump(func_get_args());
} create('@'); ==》
输出array
=> string '@' (length=)
create('@',’dd’); ==>
array
=> string '@' (length=)
=> string 'dd' (length=)

三   call_user_func_array

— 调用回调函数,并把一个数组参数作为回调函数的参数

<?php
function foobar($arg, $arg2) {
echo __FUNCTION__, " got $arg and $arg2\n";
}
class foo {
function bar($arg, $arg2) {
echo __METHOD__, " got $arg and $arg2\n";
}
} call_user_func_array("foobar", array("one", "two")); $foo = new foo;
call_user_func_array(array($foo, "bar"), array("three", "four"));
?> 以上例程的输出类似于: foobar got one and two
foo::bar got three and four

如你所见,通过载入不同的array配置可以回调不同的方法,可以用于某些事件监听与触发之间

四    ReflectionClass 反射

这当然是一个最为重要的部分。在框架调度的过程中,经常用到反射

//类测试与反射
class testExtend{
public function sikao(){
//echo 'I am thinking ......';
} }
class test extends testExtend{
public function __construct()
{
echo "i am construct ....";
}
const conn = 'nihao';
const conn1 = 'nihao';
public $nl = ;
public $nl2 = ; public function addNl(){
$this->nl = ;
}
public function say(){
echo 'i am say...';
}
public function sikao(){
echo 'i am thinking......';
}
} $ref = new ReflectionClass('test' ); //参数用类名也可以用对象
var_dump($ref);
getClass($a); function getClass($className){
echo '<pre>';
$ref = new ReflectionClass($className);
echo 'class name is : '.$ref->getName().'<br><br>';
//获取常量
$contans = $ref->getConstants();
echo 'the contans is : ';
foreach ($contans as $k => $v) {
echo $k . ' : ' . $v . ' || ';
}
echo '<br>','<br>'; //获取属性
$shuxing = $ref->getProperties();
foreach ($shuxing as $k => $v) {
foreach ($v as $i => $j) {
if( 'name' == $i){
echo 'the '. $k .' shuxing is : '.$j .'<br>';
}
}
}
echo '<br>'; //获取方法
$mothods = $ref->getMethods();
foreach ($mothods as $k => $v) {
foreach ($v as $i => $j) {
if( 'name' == $i){
echo 'the '. $k .' methods is : '.$j .'<br>';
}
}
}
}

 五  __callStatic && __call

__call 当要调用的方法不存在或权限不足时,会自动调用__call 方法。

__callStatic 当调用的静态方法不存在或权限不足时,会自动调用__callStatic方法。

/**
* 魔术方法
*
* @param type $name
* @param type $arguments
* @return type
*/
public static function __callStatic($name , $arguments ) //$name 为调用方法名,$arguments 为参数
{
//$name = get
// var_dump($arguments);array
// 0 => string 'm' (length=1)
// 1 => boolean false
return call_user_func_array('self::getAll', array_merge(array ($name), $arguments));
}

数据操作:

六 ArrayAccess(数组式访问)接口 :像数组一样来访问你的PHP对象

class Test implements ArrayAccess {
private $elements; public function offsetExists($offset){
return isset($this->elements[$offset]);
} public function offsetSet($offset, $value){
$this->elements[$offset] = $value;
} public function offsetGet($offset){
return $this->elements[$offset];
} public function offsetUnset($offset){
unset($this->elements[$offset]);
}
}
$test = new Test();
$test['test'] = 'test';//自动调用offsetSet
if(isset($test['test']))//自动调用offsetExists
{
echo $test['test'];//自动调用offsetGet
echo '<br />';
unset($test['test']);//自动调用offsetUnset
var_dump($test['test']);
}

七 数据连贯操作举例

class test{
public $nl = 0;
public $nl2 = 10; public function say(){
$this->nl = 100;
return $this; //重点在于返回当前类实例
}
public function sikao(){
echo $this->nl;
}
} $a = new test();
$a->say()->sikao();

八 闭包

1 匿名函数

提到闭包就不得不想起匿名函数,也叫闭包函数(closures),貌似PHP闭包实现主要就是靠它。声明一个匿名函数是这样:

$func = function() {

}; //带结束符

可以看到,匿名函数因为没有名字,如果要使用它,需要将其返回给一个变量。匿名函数也像普通函数一样可以声明参数,调用方法也相同: 代码如下:
$func = function( $param ) {
    echo $param;
};
$func( 'some string' );
//输出:
//some string

2 闭包

将匿名函数在普通函数中当做参数传入,也可以被返回。这就实现了一个简单的闭包。

/例一 //在函数里定义一个匿名函数,并且调用它
function printStr() {
    $func = function( $str ) {
        echo $str;
    };
    $func( 'some string' );
}
printStr();
//例二
//在函数中把匿名函数返回,并且调用它
function getPrintStrFunc() {
    $func = function( $str ) {
        echo $str;
    };
    return $func;
}
$printStrFunc = getPrintStrFunc();
$printStrFunc( 'some string' );
//例三
//把匿名函数当做参数传递,并且调用它
function callFunc( $func ) {
    $func( 'some string' );
}
$printStrFunc = function( $str ) {
    echo $str;
};
callFunc( $printStrFunc );
//也可以直接将匿名函数进行传递。如果你了解js,这种写法可能会很熟悉
callFunc( function( $str ) {
    echo $str;
} );

3 连接闭包和外界变量的关键字:USE【重点】

闭包可以保存所在代码块上下文的一些变量和值。PHP在默认情况下,匿名函数不能调用所在代码块的上下文变量,而需要通过使用use关键字。

换一个例子看看:

function getMoney() {
    $rmb = 1;
    $dollar = 6;
    $func = function() use ( $rmb ) {
        echo $rmb;
        echo $dollar;
    };
    $func();
}
getMoney();
//输出:
//1
//报错,找不到dorllar变量

MVC框架入门准备(一)的更多相关文章

  1. spring mvc框架入门

    目录 1.web框架分层 2.什么是springmvc 3.springmvc的优势 4.springmvc和struct的区别 (spring mvc框架入门 1.web框架分层 一般web框架可以 ...

  2. spring MVC框架入门(外加SSM整合)

    spring MVC框架 一.什么是sping MVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 W ...

  3. MVC框架入门准备(三)事件类 - 事件的监听和触发

    在mvc框架中可以看到事件类,实现事件的监听和触发. 举例: <?php /** * 事件类 */ class Event { // 事件绑定记录 private static $events; ...

  4. MVC框架入门准备(二) - 语言包类与工厂模式

    语言包类: 相关配置项 LANG_FOLDER : 语言包目录名,默认为Lang LANG_AUTO : 自动识别语言,默认为true DEFAULT_LANG : 默认语言,默认为zh-cn方法 取 ...

  5. 源码分析系列 | 从零开始写MVC框架

    1. 前言 2. 为什么要自己手写框架 3. 简单MVC框架设计思路 4. 课程目标 5. 编码实战 5.1 配置阶段 web.xml配置 config.properties 自定义注解 5.2 初始 ...

  6. .NET轻量级MVC框架:Nancy入门教程(二)——Nancy和MVC的简单对比

    在上一篇的.NET轻量级MVC框架:Nancy入门教程(一)——初识Nancy中,简单介绍了Nancy,并写了一个Hello,world.看到大家的评论,都在问Nancy的优势在哪里?和微软的MVC比 ...

  7. Java - Struts框架教程 Hibernate框架教程 Spring框架入门教程(新版) sping mvc spring boot spring cloud Mybatis

    https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html?tid=6 ...

  8. Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行(含系列目录)。

    前言: Taurus.MVC 微服务版本已经发布了:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单. 以前都是框架发布时写点相关功能点的文章,没有形成 ...

  9. Taurus.MVC 微服务框架 入门开发教程:项目部署:1、微服务应用程序常规部署实现多开,节点扩容。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

随机推荐

  1. 【转】关于BeanUtils.copyProperties的用法和优缺点

    一.简介:  BeanUtils提供对Java反射和自省API的包装.其主要目的是利用反射机制对JavaBean的属性进行处理.我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对Jav ...

  2. 用API处理位图

    procedure TForm1.Button1Click(Sender: TObject); var dc : hdc; MemDc : hdc; MemBitmap : hBitmap; OldM ...

  3. go_结构体和方法

    面向对象:go语言仅支持封装不支持继承和多态 所以go语言没有class,只有struct(结构体) 无论地址还是结构本身,一律用 . 来访问成员 go语言编译器可以自动区分是值传递还是指针传递,值传 ...

  4. leetcode 21 Merge Two Sorted Lists 合并两个有序链表

    描述: 合并两个有序链表. 解决: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if (!l1) return l2; if (!l2) ...

  5. MongoHelper

    /* @@decription mongodbHelper @@version 1.0 @@author think_fish&&dachie @@copyright think_fi ...

  6. jave 逻辑运算 vs 位运算 + Python 逻辑运算 vs 位运算

    JAVA中&&和&.||和|(短路与和逻辑与.短路或和逻辑或)的区别 博客分类: 面试题目 Java.netBlog  转自 :http://blog.csdn.net/web ...

  7. sqlserver怎么将excel表的数据导入到数据库中

    在数据库初始阶段,我们有些数据在EXCEL中做好之后,需要将EXCEL对应列名(导入后对应数据库表的字段名),对应sheet(改名为导入数据库之后的表名)导入指定数据库, 相当于导入一张表的整个数据. ...

  8. php redis 单例模式

    单例模式思想其实很简单 首先 有一个实例的静态变量 构造方法和克隆方法设置为私有,防止外部直接new 提供一个获取实例的静态方法 代码如下: class Redis { private static ...

  9. CodeForces - 669D——(思维题)

    Little Artem is fond of dancing. Most of all dances Artem likes rueda — Cuban dance that is danced b ...

  10. 使用 log4j 打印日志

    开发阶段:发现程序的问题,排错 产品阶段:记录程序运行的状况 Maven中配置依赖 通过配置文件输出日志的格式,输送的位置等 一.入门实例 1.新建一个JAva工程,导入包log4j-1.2.17.j ...