thinkphp ~ php中 的类, 的成员变量, 本身是没有类型说明的, 那么我怎么知道它的类型呢? 或初始值呢?

通常在类定义中, 如果能给一个初始值的(对于已知简单类型的),最好给一个初始值, 以说明其初始值或类型(尽管类型是可以改变的,但是不会去做自己整自己的傻事), 如果成员是类实例,则不说;

然后要在 $__construct中去初始化成员, 或初始化 对象成员.

namespace Think\Template;
class TagLib{
protected $tagLib = '';
protected $tags = array(); protected $tpl; // 这个是标签库的一个成员, 它是一个模板对象,但是你无法声明其类型, 要在__construct构造函数中去初始化它 public function __construct(){
....
$this->tpl = \Think\Think::instance('Think\\Template');
} }

**对于tp框架的类库 内部的操作, 好像 根路径是从 ThinkPHP/Library 为根开始的, 即\ 就表示 ThinkPHP/Library, 而项目模块中,自定义的类的 路径好像是从 Home开始的 **

其实自定义标签很有用, 以前老是想在前台html页面中实现某些功能, 都没有做到,比如 要连续地输入多个空格,..., 因为其中要牵涉到使用php的后台代码,现在有了自定义标签库,就可以用html的标签去调用用php实现 的代码功能了.

php在定义类的时候, 跟C++有点区别, c++中定义类,要在定义的后面加上分号;, 类定义作为是作为一个语句的, 而php类的定义, 最后面可以不加分号;

public, protected, private等access level只是针对 "类的" 成员, 成员变量和成员函数才用这个, 对函数内部的变量是不用这个的.

不要重复的 反复的犯一个低级错误了: 如果是tp中的类 *.class.php 文件,一定要在文件的开头 写上 <?php ... 否则系统不会认为这是 一个php文件, 因此不会认为其中的class...是一个类,所以会报错: 实例化一个不存在 的类. 在windows下的编辑器还不会显示代码颜色高亮, 但是在shell中你就不容易发现了,所以一定要记得写php标签. 这个跟c++文件不一样:c++文件是不需要开始标签的, 可以直接写code.. . 所以要注意他们的区别!

php的结束标签 在手册中,是强烈建议不要加的: 因为结束标签 后的任何空格都可能引起很蛋疼 的错误. 如果是要被别人包含的时候,只是在结束时加上结束注释.


要解决路径问题, 最简单的方法是把 自定义标签库放到 跟 内置标签库 Cx.class.php一样的位置. 然后只配置两个配置项: 'TAGLIB_PRE_LOAD' => 'my' 'TAGLIB_BUILT_IN' => 'cx,my'

而'APP_AUTOLOAD_PATH' => ''.在3.2.3中已经被废弃,因为它要关闭namespace, 'APP_USE_NAMESPACE' => false, 但是一旦关闭,所有点控制器都会失效!

而且 My.class.php 自定义标签库好像也不用命名为 TagLibMy.class.php.?!


最终总结: 解决方案

  1. 自定义标签库的放置的位置不是严格指定的, 通常放在 Home\TagLib\ 目录中
  2. 标签库文件的名字,不要参考手册, 直接写就是了, 如 My.class.php文件中:

    (当然你也可以写TagLibMy.class.php, 类也定义成TagLibMy,以及配置文件做相应修改都是可以的, 只是没有必要搞得那么复杂)
<?php
namespace Home\TagLib;
use Think\Template\TagLib; class My extends TagLib {
protected $tags = array(
'nspace' => array('attr'=>'num', 'close'=>0), // 'close'=>0 表示闭合,表示像<input .../> <br>这样的标签.
// 后面还可以定义其他标签 ); public function _nspace($tag, $content){ // 目的是要把标签解析成为一个php字符串.
$num = $tag['num'];
$parseStr = '<?php for($i=0;$i<'.$num.';$i++): ?>'; // 表示php代码中的左边大括号, 要用冒号.
$parseStr .= "&nbsp;"; // 循环体中的部分, 要在前面的 上一语句中, 把php标签结束. 而且要用双引号,才能解析 &..; $parseStr .= '<?php endfor; ?>'; // 要表示循环的结束,的 右大括号, 要单独用php标签,使用endfor; endif;等 return $parseStr; // $content表示 非闭合标签的中间的内容, 如volist标签中 包含的内容{$id['name']{$id['score']等等
// 有必要的时候, 需要调用 标签库的tpl去解析: $parseStr .= $this->tpl->parse($content);
} } 3. 当前模块的配置文件中,配置上 预加载和内置标签 <?php
return array(
'TAGLIB_BUILD_IN' => 'cx,Home\TagLib\my', // 非常注意, 这里是 build 不是built!!
'TAGLIB_PRE_LOAD'=>'Home\TagLib\My',
); 'TAGLIB_PRE_LOAD'=>'Home\TagLib\My',最后的标签库名字严格区分大小写!
而内置标签库的名字则不区分大小写 'TAGLIB_BUILT_IN' => 'Cx,Home\TagLib\my', 使用自定义标签库
abc<nspace num="10" />abc, 则是连续生成num个空格

thinkphp自定义标签库的更多相关文章

  1. ThinkPHP - 自定义标签库 - 标签驱动

    ThinkPHP 官方文档:http://document.thinkphp.cn/manual_3_2/taglib_driver.html 创建一个类,继承自TagLib类: <?php / ...

  2. ThinkPHP3.2.3 自定义标签库的使用

    ThinkPHP 3.2.3 手册中标签库驱动的地址是: http://www.kancloud.cn/manual/thinkphp/1859 标签库的地址是:http://www.kancloud ...

  3. JSP自定义标签库

    总所周知,JSP自定义标签库,主要是为了去掉JSP页面中的JAVA语句 此处以格式化输出时间戳为指定日期格式为例,简单介绍下JSP自定义标签的过程. 编写标签处理类(可继承自javax.servlet ...

  4. jsp 自定义标签库

    自定义标签的作用 *** 自定义标签的主要用于移除jsp页面中java代码 *** JSP页面中使用自定义的标签 使用jsp指令<% @taglib uri="标签库的uri" ...

  5. [JSP]自定义标签库taglib

    自定义标签的步骤 自定义标签的步骤大概有三步: 1.继承javax.servlet.jsp.tagext.*下提供的几个标签类,如Tag.TagSupport.BodyTagSupport.Simpl ...

  6. JavaWeb学习之JSTL自定义标签库的使用、JSTL自定义函数库(7)

    一.自定义标签,步骤 * 确定需求 * <my:date /> 输出当前系统的时间 yyyy-MM-dd hh:mm:ss:SSS * 编写Java类 新建包名:com.yxl.tag,新 ...

  7. JavaWeb学习记录(十九)——jstl自定义标签库之传统标签

    一.传统标签 (1)JSP引擎将遇到自定义标签时,首先创建标签处理器类的实例对象,然后按照JSP规范定义的通信规则依次调用它的方法. public void setPageContext(PageCo ...

  8. 学习笔记_Java_day13_JSTL_自定义标签库(9)

    自定义标签 1 自定义标签概述 1.1 自定义标签的步骤 其实我们在JSP页面中使用标签就等于调用某个对象的某个方法一样,例如:<c:if test=””>,这就是在调用对象的方法一样.自 ...

  9. thinkphp 自定义标签

    关于标签的个人理解是 拼凑php 字符串 通过eval()来进行,返回数据.过程应该是这样的,在模板中加入 定义标签为<mytag:list></mytag>,那么在mvc 中 ...

随机推荐

  1. localhost与127.0.0.1的区别

    localhost与127.0.0.1的区别是什么 定义 localhost也叫local ,正确的解释是:本地服务 127.0.0.1在windows等系统的正确解释是:本机地址(本机服务器) 不同 ...

  2. Sublime Text 3

    Sublime Text 3 插件安装 安装 Package Control 按 Ctrl+` 或者,菜单 View > Show Console 打开命令窗口 import urllib.re ...

  3. [转]不优雅的方式处理 xlrd 中 int/float 的问题

    原址:http://blog.chedushi.com/archives/7258 最近在用 xlrd 写一个题库自动导出的程序,但碰到一个比较 ugly 的问题. 程序要求是将 xls 文件中的数据 ...

  4. 第一次在Django上编写静态网页

    新建一个Python Django工程: Win+R进入cmd命令界面,并cd到指定工程目录下,比如我的工程目录是E:\wamp\Apache24\www\ 输入E: 跳转E盘 输入cd wamp\A ...

  5. postman使用之二:数据同步和创建测试集

    数据同步 启动postman 后在右上角可以登录账号,登录后就可以同步自己的api测试脚本,连上网在办公区在家都可以同步. 创建测试集 1.点击collections,点击add folder 2.c ...

  6. HDU 1524 A Chess Game【SG函数】

    题意:一个N个点的拓扑图,有M个棋子,两个人轮流操作,每次操作可以把一个点的棋子移动到它的一个后继点上(每个点可以放多个棋子),直到不能操作,问先手是否赢. 思路:DFS求每个点的SG值,没有后继的点 ...

  7. BestCoder Round #89 Fxx and string

    问题描述 青年理论计算机科学家Fxx得到了一个只包含小写字母的字符串. 字符串的长度为\:nn,下标从1开始,第\:i\:i位的字母为\:s_is​i​​,现在Fxx想知道有多少三元组\:(i,j,k ...

  8. Map接口使用注意事项

    1,Map接口对象本身不能直接使用迭代进行输出的.因为map每个位置存放的是一对值. 而iterator每次只能找到一个值.如果一定要迭代输出,可以通过以下步骤.: 但是,Map接口只作为查找使用,输 ...

  9. android第一行代码-1.项目结构

    0.项目结构 一个简单的android项目结构大致如下 入口就是MainActivity这个类,如果对于一个陌生的项目,最好的办法是看AndroidMainifest.xml,如下 <?xml ...

  10. PyQt4入门

    PyQt4入门教程(6)_对话框 文中译者的话将用方括号[]标出.对话框(Dialogs)是现代GUI程序中不可缺少的一部分.对话本来指的是两个或者更多人之间的交流,而在计算机应用中,对话是一个可以让 ...