zoukankan      html  css  js  c++  java
  • thinkphp自定义标签库

    thinkphp ~ php中 的类, 的成员变量, 本身是没有类型说明的, 那么我怎么知道它的类型呢? 或初始值呢?
    通常在类定义中, 如果能给一个初始值的(对于已知简单类型的),最好给一个初始值, 以说明其初始值或类型(尽管类型是可以改变的,但是不会去做自己整自己的傻事), 如果成员是类实例,则不说;
    然后要在 $__construct中去初始化成员, 或初始化 对象成员.

    namespace ThinkTemplate;
    class TagLib{
    protected $tagLib = '';
    protected $tags = array();
    
    protected $tpl; // 这个是标签库的一个成员, 它是一个模板对象,但是你无法声明其类型, 要在__construct构造函数中去初始化它
    
    public function __construct(){
    ....
        $this->tpl = ThinkThink::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. 自定义标签库的放置的位置不是严格指定的, 通常放在 HomeTagLib 目录中
    2. 标签库文件的名字,不要参考手册, 直接写就是了, 如 My.class.php文件中:
      (当然你也可以写TagLibMy.class.php, 类也定义成TagLibMy,以及配置文件做相应修改都是可以的, 只是没有必要搞得那么复杂)
    <?php
    namespace HomeTagLib;
    use ThinkTemplateTagLib;
    
    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,HomeTagLibmy',  // 非常注意, 这里是	build 不是built!!
    	'TAGLIB_PRE_LOAD'=>'HomeTagLibMy',
    );
    
    'TAGLIB_PRE_LOAD'=>'HomeTagLibMy',最后的标签库名字严格区分大小写! 
    而内置标签库的名字则不区分大小写 'TAGLIB_BUILT_IN' => 'Cx,HomeTagLibmy',
    
    
    使用自定义标签库
    abc<nspace num="10" />abc, 则是连续生成num个空格
    
    

  • 相关阅读:
    ASP.NET安全问题-- 创建安全的Web应用程序
    浅谈ASP.NET内部机制(八)
    ASP.NET 配置文件纵横谈(一)
    项目开发-让设计模式成为一种心智
    浅谈ASP.NET内部机制(七)
    ASP.NET 配置文件纵横谈(二)
    GridView的分页是否真的是鸡肋呢?
    SQL开发中容易忽视的一些小地方(四)
    SQL开发中容易忽视的一些小地方( 三)
    怎样才能充分利用SQL索引
  • 原文地址:https://www.cnblogs.com/bkylee/p/6096873.html
Copyright © 2011-2022 走看看