zl程序教程

您现在的位置是:首页 >  前端

当前栏目

tp框架中的一些疑点知识-4

框架 知识 一些 TP
2023-09-14 09:08:50 时间

$_SERVER的几个元素:
script_name脚本名称, 是指这个脚本文件本身的文件名, 通常只是 : /index.php
path_info: 是从控制器/操作方法开始到最后的内容,包括路径参数但是不包括动态参数
php_self则是所有的url地址内容中除了主机后的部分, 但不包括动态查询参数
request_uri 则是所有的url地址内容中除了主机后的部分, 包括动态查询参数
query_string就是动态查询参数, 即 问号后面? 的内容(不包括问号)
比如:

对于这个url地址而言, http://localhost/index.php/home/index/foo/name/obama/age/20?a=1
 'REQUEST_METHOD' => string 'GET' (length=3)
  'QUERY_STRING' => string 'a=1' (length=3)
  'REQUEST_URI' => string '/index.php/home/index/foo/name/obama/age/20?a=1' (length=47)
  'SCRIPT_NAME' => string '/index.php' (length=10)
  'PATH_INFO' => string 'index/foo/name/obama/age/20' (length=27)
  'PATH_TRANSLATED' => string 'C:\wamp\www\home\index\foo\name\obama\age\20' (length=44)
  'PHP_SELF' => string '/index.php/home/index/foo/name/obama/age/20' (length=43)

类的操作方法, 中, 可以包含/也可以不包含 显示模板的语句(show/display语句). 但是, show和dislay只是一个普通的方法名, 它可以在操作函数的任何地方调用, 甚至你可以在同一个操作 中, 多次地 调用show 和display方法 都可以, 但是 如果在操作函数中, 使用了die语句后, 后面的语句和后置方法 _after_method方法将都不会执行.


关于连贯操作和不使用连贯操作.

order,limit, where等叫做连贯操作. 连贯操作本身是不分先后顺序的. 因为他们返回的都是模型对象本身
但是 select操作必须放在最后, 因为select操作不是连贯操作, 他返回的是结果集, 不是模型对象本身, 不是return $this;
在进行curd操作的时候, 如果不习惯连贯操作,也可以将条件放在 select, delete等操作的参数中,使用数组的形式, 其中,数组的"索引"名称就是 连贯操作的 方法名,比如:
$u -> select(array('where'=>'name="foo"', 'order' => 'create_time', 'limit' => 10));

where 的条件 连贯操作
支持三种格式的形式

  • 字符串格式, 比如: $Model -> where('name="foo" and age=20 or addr <> "chengdu" ') ->select() 字符串格式也支持数据类型的识别, 外面用双引号, 里面的数据类型中, 如果是字符串就用单引号表示. 同样的, 反过来使用单引号或双引号也是一样的. 当然更好的是使用格式预处理的方式, 支持%d, %s, %f. 预处理后面的变量可以使用数组, 也可以直接使用逗号分隔, 但是要注意, 字符串表达式还是要用and 或 or 等符号进行连接
    $m -> where("name='%s' and age=%d", array($name, $age)) -> select();
  • 数组格式
    使用拼装/ 拼接数组的方式, 数组元素的名称就是字段名, 值就是条件. 然后在 $m -> where($map) -> select();
  • 使用表达式
    上面的使用字符串方式,写法不是很方便, 使用数组方式又只能表示 "相等" 的条件, 要使用 更复杂的条件,比如 不等, 大于, between, in等条件, 就要用 "表达式"
    格式是: 前面的数组的名称, 是字段名, 后面的条件值用数组表示, 数组的第一个元素是表达式符号(用符号表示), 包括: eq, neq, gt, egt, elt(注意大于等于不是ge, 而是egt), between, not between, in 等, 第二个元素就是表达式的值.比如:
$cond['name'] = array('eq', 'foo);
$cond['age'] = array('between','10,20');

$m -> where($cond) -> where($map) -> select();
  • where支持 多次调用, 但是只能是数组多次调用, 如果where条件是字符串, 则只能使用一次
Where 条件表达式格式为:
1. 三个元素, 是为了支持and,or,xor逻辑操作,前面两个元素必须是数组的, 表示多个条件之间的逻辑组合

1. 两个元素, 支持普通的条件表达式,两个元素都用字符串表示,第一个元素是'in,not in, between, not between,like'等形式, 后一个元素是字符串,比如'1,8', '1,3,5' 或数字 10等

1. 其中,in 和 between的数字字符串 也可以用array表示. 比如
$map['id']  = array('not in','1,5,8');
$map['id']  = array('not in',array('1','5','8'));

1. 当然, 也可以将表达式符号和数字写在一起, 用exp表示: $map['id'] = array('exp', 'in(1,3,5)');

关于 异或 的意思和应用

xor(异或) xor 两个输入中只有一个是true时,结果为true,否则为false
在编程中, 如果要进行逻辑判断, 判断两个条件中, “有且只有一个条件为true”时, 就可以使用 这个 xor的逻辑运算符。


模型类并非必须定义(但是控制器的类必须显示的定义, 必须继承自 Think\Controller类), 只有当 模型中, 存在自定义的 业务逻辑(就是模型类 需要 添加/增加/自定义一些 基类Think\Model 中没有的成员方法)时, 或需要
增加一些自定义的成员属性比如 $_validate, $_auto 等时, 才需要自定义模型类. 通常如果只是对模型表进行 curd操作时, 基类提供的成员方法就已经足够了.

前缀DB_PREFIX指的是默认的 "表前缀" 是表前缀, 不是数据库的前缀, 数据库本身是不需要什么前缀的, 比如demo数据库. 如果是模型 <-> 表的前缀跟默认的不同, 则需要自定义成员属性$tablePrefix

数据库的连接信息有三种配置形式

  • 一是传统的使用数组配置方式 可以在convention.php 也可以在 应用配置或模块配置 文件中设置
  • 二是使用字符串的方式: $conn = "mysql://root:123@127.0.0.1:3306/demo#utf8"
  • 三是使用配置"常量"的方式, 在配置文件中, 设置一个常量DB_CONFIG1的数组变量, 然后在实例化中, 直接用这个DB_CONFIG1
    注意, M方法有三个参数, '模型名称', '表前缀', '连接参数'. 本来应该是 C('DB_COFNIG1'), 但是M方法会自动去获取配置参数, 所以不必使用C,直接用这个DB_CONFIG1...

当然 一般的数据库连接都使用 默认的/常规的 配置就行了, 很少使用自定义的 连接参数, 只有在 跨项目, 操作其他数据库, 非当前数据库的时候, 才使用 $conn自定义连接.


php中的运算符?

  • 算数运算符, /是求商, %是求模(即求余数); 字符串运算符包括. .=, 自增运算符 ++$a; $b--; 比较运算符,

  • 逻辑运算符: 支持单词和 符号两种形式: 其中单词形式的是 VB风格的: and(两者都为true), or(至少有一个为true), xor(表示: 有且只有一个为true时返回true). **符号形式的是 c/c++/java风格的有 &&, || , ! **
    但是, 这两种逻辑运算符的优先级是不同的. 符号形式的&& 和 || 比单词形式的优先级更高.

  • 数组运算符支持: +, == === !=

  • 更重要的是, php还支持 对变量的 按位 运算. 包括 &, |, ^(按位异或) , ~(按位 非) 移位运算(<<, >>) . 按位运算只有符号形式, 没有单词形式, 注意和 &&, || , ! 的区别

  • 注意, 在tp的xml标签 <if condition=".."> 中, 如果要使用 运算符, 要使用 字符型 or, and xor 不能使用 && || 等之类的符号.

#### php中 字符串和整数之间的 比较和运算规则?
  1. 首先, 字符串都要被转换成 整数来进行 比较 和 运算;
  2. 其次, 字符串转换的规则是 两点
    - 一是,如果包含 小数点, e 或 E 则转换为 浮点数,float, 进行运算后, 得到的结果就是 float 浮点数, 用 gettype($var) 得到的结果就是double。
    - 二是, 字符串转换成整数,结果以 “开头的字符为准” 如果开头的不是合法的数字或数字0,则转换为整数0. (注意, 开头的数字0会被忽略...)


如何计算 按位取反的结果: $a=8; echo ~$a;

在数值范围内,~a = -(a+1)

8的二进制是1000,补满32位(对于32位系统),也就是前面 28个0 1000
取反后 28个1 0111
第一位是符号位 1代表负数,剩下的 (27个1 0111 这个就是补码)
负数是用补码表示的,补码是原码取反+1,也就是说 27个1 0111 是某个数的补码,那倒推回去,这个数就是补码-1后取反,也就是 27个1 0110取反,得到27个0 1001,也就是9,再加上前面的符号位,得到-9

:补码 等于 原码取反加1;
: 原码就等于 补码 减1 取反。


为什么要使用 join操作?

  1. join的目的并不是要把多个表要连接起来, 而是 因为要查询的数据 分布在多个表中, 我们要从多个表里面取数据, 但是 连接取数 不是任意的 取数据的, 而是有依据的, 依据是 这两个表 中的 某个 关键字段 (比如用户id )要有相同的值, 这样取出的数据才有 实际意 义, 才有现实意义, 表示的是 这些数据是 相关的, 这些数据 才是表示/描述的是 同一个人的信息. 依据是用 ON 来描述的.

  2. join操作可以单独地 设置 前面那个表的 alias, 也可以 不用设置表的别名.

  3. 在table和join连贯 操作中, 使用的表 名称 都要用 全名, 比如 think_user, think_dept. 但是可以用 下划线加全大写的方式 来表示这些表名. 比如: USER, DEPT

  4. 关于操作类型, 有四种连接方式, inner join (就等于join , 这是默认的连接方式), left join, right join, full join.

  5. 表示 其他连接方式的时候, 有两种方式, 一种是 在前面说明, 即join的第一个参数前面, 另一种方式是 在join 后面, join的第二个参数规定连接方式, 为 left, right, full . 比如 $Model -> join('left join放在前面 __DEPT__ dept on __USER__.id = dept.id'); $Model -> join('__DEPT__ dept on __USER__.id=dept.id', 'left' 第二个参数);




#### 关于jquery的知识点 1. 将jquery对象转换为dom的方法有两种, 一种是 - 使用 数组下标的方式 $('p')[0], [1], [2], 这是因为 jquery对象其实是一个数组 是一个 html元素的 数组, 即 `Array `所以可以用数组的方式访问; - 使用方法 get(), 比如: $('p').get(0) // 获取第一个dom元素, .get(1)//获取第二个dom元素
<script>
$('a').click(function(){
	
	$('span').get(1).innerHTML='test';
	$('span')[1].style.color='red';
});
</script>

  1. :not是一个基本过滤器, 选中除了所说的条件之外的所有元素. 这个否定条件可以是多个, 每个否定条件之间 要用 逗号来分开! 注意是逗号, 不能用空格, 如果用空格, 将会把它看成是一个否定条件! 比如: $('span:not(".sp1, .sp2")').html('<b>test</b>').css('border', '2px solid gold'); 将选中除了有 sp1类或者 sp2类的所有span, 但是如果是: $('span:not(".sp1 .sp2")').html('<b>test</b>').css('border', '2px solid gold'); 的话, 将 只会除去 class类为 ".sp1 .sp2" 层级的span元素.

    not方法的用法也是一样的