ecmall 学习记录3
1.在ecmall.php 中 336行有一个函数
function lang_file($file)
{
return ROOT_PATH . '/languages/' . LANG . '/' . $file . '.lang.php';
}
这个是函数不在LANG 类中。函数可以直接用。类的函数也叫成员方法,不能在类外直接调用,要实例化类。
ecmall.php中 有四个类:ecmall,object,lang,conf,其他的还有系统常量,兼容配置,主要的还是 函数方法。
2.conf 类 (跟配置相关)
/**
* 加载配置项
*
* @author Garbin
* @param mixed $conf
* @return bool
*/
function load($conf)
{
$old_conf = isset($GLOBALS['ECMALL_CONFIG']) ? $GLOBALS['ECMALL_CONFIG'] : array();
if (is_string($conf))
{
$conf = include_once($conf);
}
if (is_array($old_conf) && is_array($conf))
{
$GLOBALS['ECMALL_CONFIG'] = array_merge($old_conf, $conf);
}
else
{
$GLOBALS['ECMALL_CONFIG'] = $conf;
}
}
/**
* 获取配置项
*
* @author Garbin
* @param string $k
* @return mixed
*/
static function get($key = '')
{
$vkey = $key ? strtokey("{$key}", '$GLOBALS[\'ECMALL_CONFIG\']') : '$GLOBALS[\'ECMALL_CONFIG\']'; return eval('if(isset(' . $vkey . '))return ' . $vkey . ';else{ return null; }');
}
一般用到加载配置项,都是 先 load 再 get 。
load() 就是将 配置文件赋值给全局变量 $GLOBALS['ECMALL_CONFIG']
get() 就通过键 来获取在load()中刚刚被赋值的 $GLOBALS['ECMALL_CONFIG'] 中对应键的值。
小例子:
控制器代码:

goods.inc.php中的部分配置:

在控制器中加载配置项:
load()传参是字符串,也就是引入了配置项并且赋值给了全局变量$GLOBALS['ECMALL_CONFIG'];
然后在调用get方法 加载键为category_good_num对应的值。 从而获得商品配置。
2017-7-7.点滴知识,重在积累。
---------------------------华丽的分隔线--------------------------------------
1.ecmall.php中的
import()函数:
function import()
{
$c = func_get_args();
if (empty($c))
{
return;
}
array_walk($c, create_function('$item, $key', 'include_once(ROOT_PATH . \'/includes/libraries/\' . $item . \'.php\');'));
}
func_get_args() 将传给当前函数所有的参数 组成 牵引 数组 并返回:
function foo() { // returns an array of all passed arguments
$args = func_get_args();
foreach ($args as $k => $v) {
echo “arg”.($k+1).”: $v\n”;
}
}
foo(); /* 没用任何输出*/
foo(‘hello’); /* 输出 arg1: hello */
foo(‘hello’, ‘world’, ‘again’); /*输出 arg1: hello arg2: world arg3: again */
现在举个例子 (=_=)
import("function.lib"); //调用上面的引入类函数
// 然后 function_get_args() 返回的是
// array(1) { [0]=> string(12) "function.lib" }
// 接着 create_function()创建了一个新函数: 有两个参数$item和$key,方法体是 :
// include_once(ROOT_PATH . \'/includes/libraries/\' . $item . \'.php\');
// 即引入 根目录下指定路径里的 $item.php文件 //然后 array_walk($c,areate_function(...))
// array_walk()作用就是 将第一个参数$c(数组) 遍历循环,$c 的每一个值都传到creat_function 中执行一次。
// 根据上面$c只有一个键值对, 那么,import("functions.lib")执行的结果就是引入了 项目根目录/includes/libraries/functions.lib.php
原来以为import()是把整个项目目录遍历查找同名文件引进来,还琢磨着万一有了同名文件怎么办,直到看了类库才知道,同名文件的想法是有多蠢(→_→)
2.ecmall 适配php5.5 需要用到的 preg_replace_callback()函数:
<?php
// 将文本中的年份增加一年.
$text = "today is 04/01/2002\n"; function next_year($matches)
{
// 通常: $matches[0]是完成的匹配
// $matches[1]是第一个捕获子组的匹配
// 以此类推
return $matches[1].($matches[2]+1);
}
echo preg_replace_callback(
"|(\d{2}/\d{2}/)(\d{4})|",
"next_year",
$text); ?>
一个例子,定义$text,定义了回调函数next_year,调用preg_replace_callback()
第一个参数:正则表达式,第二个是参数是回调函数,最好是直接将函数写进来,第三个是要进行匹配的字符串。
在next_year中打印 $matches:
array(3) { [0]=> string(10) "04/01/2002" [1]=> string(6) "04/01/" [2]=> string(4) "2002" }
为什么会分成04/01 和 2002 呢?
这和正则表达式有关系:(\d{2}/\d{2}/)(\d{4}) 第一对()就是$matches[1]。也叫做第一个捕获子组的匹配,第二对()就是$matches[2];
通常: $matches[0]是完成的匹配 , $matches[1]是第一个捕获子组的匹配 , 以此类推
然后会执行年份加一,并且将结果返回。先看最终结果: today is 04/01/2003
修改next_year的ruturn 语句为 $matches[1]."------".($matches[2]+1);
再进行输出,结果为today is 04/01/------2003
这样看来,preg_replace_callback('匹配表达式a','回调函数b',‘需要匹配的内容c’)就是 将 c 在 a 中匹配到的 内容 d 替换 成 经过 b 处理后的 d 最终返回处理后的 c。
在preg_replace_callback()中传入 回调函数 b 的 $matches 是数组的形式,要用下标【1】【2】(我是这么理解的 = =) 在正则表达式中 \1 \2 同样是指 第一个捕获子组 第二个捕获子组
在model.app.php中 //$fields = preg_replace('/([a-zA-Z0-9_]+)\.([a-zA-Z0-9_*]+)/e', "\$this->_getFieldTable('\\1') . '.\\2'", $fields); 这里的'\\1'. '.\\2' 就是指第一,第二个捕获子组的匹配,用了转义符号 \ 。
也就是这样:
<?php
// 将文本中的年份增加一年.
$text = "today is 04/01/2002\n"; // echo preg_replace_callback(
// "|(\d{2}/\d{2}/)(\d{4})|",
// function ($matches)
// {
// return $matches[1].($matches[2]+1);
// },
// $text); echo preg_replace('|(\d{2}/\d{2}/)(\d{4})|', "\\1 ----\\2", $text); //在这里 加 1, 我试了半天也没加成功,难道是被抛弃了? ?>
输出结果是:today is 04/01/ ----2002 同样也是 用 \1 ----\2 (这里我把转义符去掉了)来替换了已经匹配到的内容,现在这个函数好像不太用了,都用preg_replace_callback()
上面可以写成这样:
<?php
// 将文本中的年份增加一年.
$text = "today is 04/01/2002\n"; echo preg_replace_callback(
"|(\d{2}/\d{2}/)(\d{4})|",
function ($matches)
{
return $matches[1].($matches[2]+1);//新的日月年来替换文本内被匹配的内容
},
$text); ?>
执行结果是一样的。
测试:
$string = 'April 15, 2003' ;
$pattern = '/(\w+) (\d+), (\d+)/i' ;
$replacement = '\\1 18,\\3'; echo preg_replace ( $pattern , $replacement , $string ); //输出 April 18,2003
修改后:
$string = 'April 15, 2003' ;
$pattern = '/(\w+) (\d+), (\d+)/i' ;
echo preg_replace_callback(
$pattern,
function($msg){
return $msg[1]." ".($msg[2]+3).",".$msg[3];
},
$string ) //输出 April 18,2003
2017/7/10
ecmall 学习记录3的更多相关文章
- ecmall 学习记录2
1.ecmall 自带的写入日志方法:do_log4php("函数名","类名",$param); $param是参数 在类里调用写入之日的方法 需要先加载 ...
- ecmall 学习记录
1. /* 载入配置项 */ $setting =& af(MODULE); Conf::load($setting->getAll()); af方法定义如下: /** * 获取数组文件 ...
- Quartz 学习记录1
原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...
- Java 静态内部类与非静态内部类 学习记录.
目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...
- Apache Shiro 学习记录4
今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...
- UWP学习记录12-应用到应用的通信
UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...
- UWP学习记录11-设计和UI
UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...
- UWP学习记录10-设计和UI之控件和模式7
UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...
- UWP学习记录9-设计和UI之控件和模式6
UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...
随机推荐
- K8S学习笔记之ETCD启动失败注意事项
最近搭建K8S集群遇到ETCD的报错,报错信息如下,一定要关闭防火墙.iptables和SELINUX,三个都要关闭!! Mar 26 20:39:24 k8s-m1 etcd[6437]: heal ...
- linux 英汉词典程序shell+postgresql版
在linux控制台下工作,有时候遇到不懂的单词,想要找个linux下的词典程序,搜寻无果,只好自己动手写个了. 首先获取词典文本文件,在github上找到一个 建立数据库 create databas ...
- jsp传Array数组到后台
jsp页面传递对象数组到后台的需求 JSP: //保存 $("#submitBtn").click(function(){ var flag = true; var eachfla ...
- JS设计模式(9)享元模式
什么是享元模式? 定义:享元模式是一种优化程序性能的模式,本质为减少对象创建的个数. 主要解决:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存 ...
- 解决多个div左浮动后不换行问题
问题描述:我这里有多个li 让其左浮动,并且有序没有间隙的排列,就出现了中间空隙的问题: 解决办法:让每一个的第1个元素加上 clear:both属性,我这里每一行有2个,所以是: .b li:nth ...
- 动态从数据库获取数据,省市县三级联动,有校验,导出Excel模板
话不多说,看效果图,直接上代码. sheet 商户表 hideSheet ,功能完成后隐藏的Sheet,用于储存下拉框中的信息,(以一定的规则将所需数据存储在表格中). 下面是代码 部分数据需要在导 ...
- Android中intent的分类及使用
intent分为隐式和显式,显式的浅显易懂就是直呼其名,可用intent类的一个构造函数,直接传入context和想要打开的活动的名称.还可以用setcomponent方法来确定要打开的活动的名称.而 ...
- vc++2010如何新建项目并在控制台打印helloworld
关于写c++使用什么集成开发环境的问题其实挺纠结的.我找了好久找到codeblocks,发现这款IDE还是最适合用在最标准的c++语法环境中.其实先前装过vs2015旗舰版,但是这款软件太大了,非常消 ...
- css的再深入9(更新中···)
一 单位 1.px 就是一个基本的单位 像素 2.em 也是一个单位 用父级元素的字体大小乘以em前面的数字.如果父级没有就继承上一个父级直到body,如果body没有那就默认是16px. 3.rem ...
- shell编程(一)之变量
变量:命名的内存空间 bash的变量种类: 根据变量的生效范围等标准 本地变量: 生效范围为当前shell进程:对当前shell之外的其他shell进程,包括当前shell的子shell进程均无效 环 ...