第三: 使用 ; 来重复查询到内容
比如有一行内容 this is test.
这个时候光标在开头。 使用f可以用来查找行内的字符。
比如fs查到到this 中的s , 再次输入 fs 查找到 is 中的 s 。其实 使用 ; (分号就可以继续查查s)
一个示例
比如 a+b+c+d 现在想让表达式变为 a + b + c + d
可以看到就是把每一个加号两侧添加一个空格。
使用名f+s + <esc>
这些字符是 f+s(空格)+(空格)最后回到正常模式
表示: 查找(f)加号(+)之后用替换(s) 空格+空格 之后回到正常模式
这里需要考虑一个问题, 点(.) 重复的是什么
比如你输入 abc 之后输入 <esc>
这个时候按下点(.) 就会发现重复的是abc三个字母。
第二: 高级重复
试想有这样一个问题:
你想把每一行的最后增加一个分号。
使用的命令应该是 A
这样就把光标移动到了文件的末尾。之后输入;(分号)
回到正常模式, 点击 j.
就可以重复操作了。
重复的内容就是 移动到行尾,加入分号。
--------------
C 删除光标到行尾的内容 <==> c$
s 表示替换一个字符,这个操作是 删除当前的字符后, 进入到插入模式。 <==> cl
// c 是用来删除字符用的, cl 表示删除光标右边的字符, ch 删除光标左边的字符。 x 删除光标所在的字符。 cc 删除正行。
// x 删除后还是插入模式
S(大写的), ^C, dd (都是删除一行)
I <===> ^i 在行的开始插入
A <==> $a 行的末尾插入
o <==> A<CR> 下一行插入
O <==> ko 先上一行,之后插入
/*
file: config.php
<?php
$config['name'] = 'mysql';
$config['user'] = 'root';
*/
function get_config($replace = array()) {
static $_config;if(isset($_config)) {
echo 'here line: ' . __LINE__ . " is running \n ";
return $_config[0];
}include 'config.php';
if(count ($replace) > 0) {
foreach($replace as $key => $val) {
if(isset($config[$key])) {
$config[$key] = $val;
}
}
}
var_dump($config);
return $_config[0] = &$config;
}function config_item($item) {
static $_config_item = array();if(!isset($_config_item[$item])) {
$config = &get_config();
if(!isset($config[$item])) {
return FALSE;
}
$_config_item[$item] = $config[$item];
}
return $_config_item[$item];
}get_config(array( 'user' => "new user"));
var_dump(config_item('user'));
静态变量的作用域比较特殊, 如果在函数内定义的变量。
随着函数的结果, 普通的内部变量也就消失了。 静态变量不同。
首先看一个示例
function f() {
static $x = 0;if(isset($x)) {
echo "yes";
} else {
echo "no";
}
}f();
执行的结果是 yes
如果是
function f() {
static $x;if(isset($x)) {
echo "yes";
} else {
echo "no";
}
}f();
执行的结果就是 no. 说明函数中没有 $x.
这就是静态变量和一般变量的区别。
静态变量离开函数的时候可以保存值。
function f() {
static $x;echo ++$x;
}for($i = 0; $i < 3; $i++) {
f();
}
这个结果输出的是 123 说明两点
第一: 静态变量没有赋值的时候 ,是0。 其实这种说法不准确,如果是字符串就不一定。
第二: 静态变量的作用域不仅仅在函数内。
ci中load_class 的模拟
首先在同一个目录下三个文件
test1.php
<?php class test1{}
test2.php
<?php class test2{}
3. index.php
function &load_class($class, $prefix = '') {
// 用来存储已经加载的的类
static $_classes = array();if(isset($_classes[$class])) {
return $_classes[$class];
}$name = FALSE;
if(file_exists($class . ".php")) {
$name = $prefix . $class ;
require($class. ".php");
}if($name === FALSE) {
die('加载的类不存在, 也就是文件 ' . $class .'.php 不存在' );
}// is_loaded($class);
$_classes[$class] = new $name();var_dump($_classes);
return $_classes[$class];
}load_class('test1');
load_class('test2');
打印的结果
array(1) {
["test1"]=>
object(test1)#1 (0) {
}
}
array(2) {
["test1"]=>
object(test1)#1 (0) {
}
["test2"]=>
object(test2)#2 (0) {
}
}
ci框架中的 load_class (ci中load_class 的模拟)
首先定义一个静态的变量$_classes 用来存储已经加载过的类。 然后判断如果加载过了.
就直接返回这个类的一个实例。 然后结束。
这个过程中需要用一个 $name 来实现, $names就是 $_classes中的索引。 返回的结果
就是 $_classes[$class] .
所以下来
有语句 $name = FLASE;这里要开始加载 类。
加载的方式从两个地方。 APPPATH ,这个地方是用户的app下的。 第二个 BASEPATH是系统目录下的。
如果找到了类的文件, 就生产 $name. $name的格式就是 $prefix. $class.
之后加载扩展中的类 和这个做发一样,只是使用了,自定义的前缀设置。
这样,通过$name 是否设置成功就可以判读,想加载的类是否成功了。
最后把加载过的$class保存起来,生成一个实例。 返回。就完成了。
function &load_class($class, $directory = 'libraries', $prefix = 'CI_') {
static $_classes = array(); // 用来存储已经load过的class
// Does the class exist? If so, we're done...
// 这里判断要加载的类是否已经加载,
if (isset($_classes[$class])) {
return $_classes[$class];
}$name = FALSE;
// Look for the class first in the local application/libraries folder
// then in the native system/libraries folder
// 这里加载的类是 libraries 中的类
foreach (array(APPPATH, BASEPATH) as $path) {
if (file_exists($path . $directory . '/' . $class . '.php')) {
$name = $prefix . $class; // 这个只是起一个名字, 方便数组(已经加载过的类)索引
// 这里判断如果有个类 CI 开头的就不再执行 require
if (class_exists($name) === FALSE) {
require($path . $directory . '/' . $class . '.php');
}break;
}
}// Is the request a class extension? If so we load it too
// 这里加载的是扩展中的类,区别是 config_item('subclass_prefix')
if (file_exists(APPPATH . $directory . '/' . config_item('subclass_prefix') . $class . '.php')) {
$name = config_item('subclass_prefix') . $class;if (class_exists($name) === FALSE) {
require(APPPATH . $directory . '/' . config_item('subclass_prefix') . $class . '.php');
}
}// Did we find the class?
if ($name === FALSE) {
// Note: We use exit() rather then show_error() in order to avoid a
// self-referencing loop with the Excptions class
exit('Unable to locate the specified class: ' . $class . '.php');
}// Keep track of what we just loaded
is_loaded($class);$_classes[$class] = new $name();
return $_classes[$class]; // 这返回加载的类, 因为这个函数是引用返回。所以都将挂载某个地方。
}
生成url的时候, 一不小心最后多出了一个 / ;
可能的原因是 定义网站根目录的时候最后多了一个 /.
只用使用这样的代码就可以去除多余的
$url = ttrim($url, '/'). '/';
这样最后就只有一个 /.
原理: 不管有几个全部删除了,最后再添加一个。
如果在命令行下面运行这些命令会输出两个yes
if(defined('STDIN')) {
echo "yes";
} else {
echo "no";
}if(defined('STDOUT')) {
echo "yes";
} else {
echo "no";
}
也就是说这个两个是已经定义的。
首先看看在命令行下 stdin 如何使用
$stdin = fgets(STDIN);
echo "you input string : ";
echo $stdin;
echo "\n === end === \n";$ans = fscanf(STDIN, "%d", $int);
echo "you input int: ";
echo $int;var_dump($ans); // int(1);
这里 stdin 就是标准输入的意思。
结构标签
html, head, body, div, span
meta 标签script
文本 标签
h*, p, em, abbr, address, blockquote, q(行间小型引用), cite(行间引用)
code, ins(插入内容), del(删除内容), dfn, kbd, per, samp(举例子), var(定义变量)
连接
a, vbase
图像
img, area, map, object, param,
列表
ul, ol, li, dl, dt, dd
表格
table, tr, td, th, tbody, thead, tfoot, col, colgroup, caption
表单
form, input, textarea, select, option, optgroup, button, label, filedset, legent
脚本
script, noscript
表现
b, i, tt, sub, sup, big, small, hr
过渡
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2. 严格
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
3. 使用框架技术
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
常用的是第一种, 遇到的问题也少