日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tp框架中的一些疑点知识-5 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關于vim中的緩存區的前后bp和bn的界定

  • 通過命令ls可以看到 緩存區的 排序. 最開始打開的文件排在最上面, 序號最小. 那么它們就是 更 的緩沖區.
  • 序號更前的用bp, 序號靠后的用bn. 但是 序號的數字不一定是挨著的
  • 你自己也可以 根據打開文件的先后次序來判定 p和n, 如果打開當前文件后, 再打開第二個文件, 那么第二個文件就是 后next文件, 當前文件就是previous文件. 所以 , 在第二個文件編輯的時候, 要回到當前文件, 就要用 bp..

關于路由?

  • 首先要明確, 使用路由訪問某個頁面時, 他的url地址的寫法: 由于路由總是只能在 模塊內進行路由(不能跨模塊路由, 不能省略 模塊名稱), 所以, 使用路由進行訪問時, url地址中的 路由表達式 總是放在 模塊名稱后面的: 比如: http://serverName/index.php/Home/ (這里才是路由表達式) 或者偽靜態的url訪問地址是: http://servername/Home/(路由表達式放這里) 而不是直接放在 servername后, 比如: localhost/index.php/路由表達式 或 localhost/路由表達式 這兩個都是錯誤的, 訪問不到的!

  • 其次, 是 路由地址, 分為內部地址和外部地址(閉包函數另算).

1. 內部地址的 格式: 總是 [模塊名可以省略]/控制器名稱/操作名稱 (也就是說一定要是控制器/操作名稱, 而不是隨意寫的)

參數的方式有 三種: 一種是參數都作為字符串放在路由地址后面: [home/]About/contact?var1=value1&var2=value2.. ?問號前面通常不要斜杠
或者把 路由地址, 附加參數, 控制參數比如 array('ext'=>'html') 三者放在數組中也是可以的

2.外部地址的格式: 就是比較隨意的了, 不需要用 控制器,操作來說明的了, 可以直接用 根路徑/或 全局http:// 路徑了.

外部地址同樣 可以用數組, 來指明 外部地址, 重定向代碼301或302等, 附加參數等

在NERDTree中, 'Tree Filtering Mappings' 是控制隱藏文件(點號開頭文件)的 / 普通文件/書簽的 "開/關鍵", 而且都是大寫的單子母, 有 I(隱藏文件開關), F(普通文件顯式和隱藏開關), B(書簽顯式和隱藏的開關).

定義vim在插入模式下, 的向左或向右的快捷鍵, 不要用 ll了, 因為很多單詞, 特別是定義控制器的controller 中包含ll, 很容易受干擾 所以 可以定義為 "zz, yy"即左左右右. 這個很少有單詞會這樣的了, 就像用jj,kk表示上下移動一樣.

在linux下, 即使 URL_MODEL的值為1, 即為pathinfo模式, 不是 rewrite模式 2, 只要html根目錄下, 存在.htaccess文件(文件名必須是這個, 不能改名), 而且里面的 RewriteRule ^(.*)$ index.php/$1 [QSA, PT,L]的話, 就能夠 實現偽靜態,(隱藏index.php入口文件). 這個.htaccess偽靜態, 對路由也是適用的!


markdown中的引用?

  • 是采用的email形式的 引用, 使用 大于符號 > 來表示的- 當然 大于符號必須頂格寫, 而且與后面的內容之間要有至少一個空格 , 注意這個頂格的意思還包括: 就是 大于符號 不能 有縮進, 也就是必須放在 當前行的 第一列! 否則如果大于符號不在第一列, 就不認為是引用, 而是 普通字符了.
  • 引用可以嵌套 > >
  • 格式注意: 因為是 blockquotes 區塊引用, 所以 即使是中間 包含空行, 這個空行的行首, 也要用 大于符號, 否則區塊引用就斷開了. 引用 區塊 斷開, 是什么意思呢 ? 就是說, 引用的內容將成為 兩個 引用部分. 這兩個引用 區塊 將是獨立的, 不相關的了.

  • 因此, 如果想 所有的 內容 都放在一個 引用 區塊blockquotes內, 就要求: 每一行(包括空行都要用 大于符號), 或者 在一個段落的 開頭用 大于符號. 或者 你可以自己先 斷好行. 都行
  • 引用內, 也可以使用 字號, 列表等, 但要注意, 這些 字號/列表等表示符號也必須要頂格寫, 就是 離前面的 大于符號必須只能有 一個 空格. 多一個空格都不行, 都無效!

  • markdown中的$ 符號沒有什么特殊含義?!


  • 關于擴展標簽庫的使用
    標簽庫的作用是, 簡化php模板和html代碼 混著寫的麻煩. 而實際上 在Runtime/Cache/Home/緩存文件.php中還是會轉化為php代碼...
  • tp中的標簽庫要用嚴格的xml語法;
    閉合標簽是指有完整的開始標簽和結束標簽(關閉/閉合標簽). 而開放(非閉合標簽)標簽是指以 / 結束的沒 有另外的結束標簽

    系統自帶的 內置標簽庫的位置在: Think\Template\TagLib\下, 包括Cx.class.php和 Html.class.php兩個標簽庫文件.
    自定義擴展標簽庫是放在 ./Application/Home/TagLib/ 目錄中, TagLib目錄需要自己創建.

    標簽庫文件的命名: 沒有特殊要求, 推薦按規范命名: TagLibMy.class.php, 或者 MyTagLib.class.php. 或者參照內置的標簽庫命名為:

    My.class.php 都可以.(自定義的標簽庫, 可以用在自己想要實現的一些功能上.)

    繼承自: Think\Template\TagLib.class.php文件類.
    標簽需要定義的屬性包括: attr, close, level(嵌套級數)...
    標簽的實現:

    ========================

    null和 空字符串 的區別, 前者表示 "真的沒有", 未曾發生過, 根本就沒有這回事! "黑洞". 而空串是有內容的,至少有結束標志符"\0" 的.

    所以, 判斷 $arr['a'] => null; if(isset($arr['a'])) 將是false. 而如果$arr['a'] = '', 則判斷isset則為true.

    isset和empty函數的區別?

    • isset是判斷數組的某個索引下標 是否設置了的, (如果下標本來就沒有設置, 或者 設置為null, 那么isset就是false.)
    • 而empty是判斷數組成員是否為空.

    對 $arr['a'] ='', 0, false來說, isset是設置了的, 返回true, 而empty則為空, 也返回true.

    內置標簽庫叫做: Cx: 意思是core xml標簽庫?

    volist標簽中的 name和 id的意思? visualization of list. id: item-data 每一項的數據.


    標簽的屬性項目?

    按常規的做法: 通常標簽中, 都有 name屬性: 表示你要處理的變量名. 一般還有value, item或者id等.
    標簽本身的寫法中, 總是只有屬性的, 而且屬性值中的name 屬性通常 是不能帶 $的(正跟html標簽的用法完全是一樣的. 你看html標簽中帶

    不帶$符號呢? ). 否則就又是hp了. 但是在 value屬性中, 可以使用 帶$ 符號的變量名.

    但是, 在標簽的內容(標簽體)中, 如果要輸出變量的值, 還是要用 {$id.username} 等方式來輸出.

    -----====================

    擴展標簽庫(自定義)的定義和使用

  • 創建擴展標簽庫類文件
  • <?php namespace Home\TagLib; // home是默認的根命名空間 use Think\Template\TagLib;class My extends TagLib{protected $tags = array('space' => array('attr' => 'count', 'close' => 0, 'level' =>1 ),);public function _space($tag){$parseStr = "<?php echo '"; // 注意這里要加單引號, 否則會報錯 因為解析后的就是 echo <br><br> ;自然就有語法錯誤.$count=$tag['count'];if ($count<1) return;for($i=0; $i<$count; $i++){$parseStr.='&nbsp;';}$parseStr.="'; ?>";return $parseStr; // 通常標簽返回的都是一個 $parseStr 字符串.} }
  • 使用標簽庫
  • 首先要引入標簽庫: <taglib name="my" /> 如果直接寫, 會提示錯誤: "實例化一個不存在的類!:Think\Template\TagLib\My" 就是說, 如果不寫路徑, 會默認在系統內置的標簽庫存放目錄 : Template\TagLib\目錄中尋找...<taglib name="Home\TagLib\my" /> 而且要嚴格對應類的大小寫: 報錯: "實例化一個不存在的類!:Home\TagLib\my" 要用 <taglib name="Home\TagLib\My" />其次, 在使用自定義標簽的時候, 要用 <my:space count="3" /> 這樣的形式.3, 為了簡化上面的操作 可以定義: 'TAGLIB_PRE_LOAD' => 'My', 'TAGLIB_BUILD_IN' => 'Cx, My',

    要創建自己的標簽(庫), 最簡單的方法, 就是將自定義標簽放到 系統內置的表情庫中.. Think\Template\TagLib\Cx.class

    但是為了 便于移植, 建議不要修改系統 原來的框架, 而是將 自定義的內容, 放到 應用模塊配置中.


    tp中類的加載?

    • tp框架在實例化一個類的時候, 首先要知道這個類在哪里,tp要到哪里去找這個類,知道這個類的位置。這個工作就是自動加載。如果一個類不能找到,tp不能加載的話就會報錯。
      自動加載 就是指在代碼中 實例化一個類對象的時候,可以直接用new方法, 而不去管這個類的定義文件在哪里。

    • 總的來說, 分為 兩種方式: 自動加載 和 import手動加載;

    • 自動加載有三種方法: Library\子目錄, 自定義‘autoload_namespace', 創建類庫映射alias.php文件中

    3種自動加載的手段:

  • 是在ThinkPHP/Library目錄下的 子目錄都會被系統自動加載,所以, Libray\Think, Libray\Org等中的類庫都可以自動加載;
  • 是自定義自動加載的命名空間: 通過在模塊配置文件中, 加入: 'AUTOLOAD_NAMESPACE' => array(...);
  • 定義類庫映射

  • ========================================

    四種加載類的方法中, 前面兩種自動加載,必須要求 第一, 類庫文件的命名要符合tp的命名規范,文件名必須以 .class.php結尾; 第二, 在聲明/定義類的時候, 一定要用 namespace語句(聲明命名空間)。而類庫映射和imprt則不需要這些限制。

    不要犯低級錯誤: 書寫錯誤, 寫錯關鍵字, 寫錯類名等, 這就要留意編輯器的 顏色高亮提示...

    return array( // 在Home/Conf/config.php文件中配置根命名空間'AUTOLOAD_NAMESPACE' => array( // 這里要注意, autoload_namespace一定要用數組, 一方面表示可以配置多個根namespace'Common' => COMMON_PATH, // 另一方面,要用前面的 索引名稱 來表示 根命名空間的名稱 , 后面是真實的路徑, 比如這里的Common是根命名空間,),);<?php // 在前臺和后臺都要使用的 類, 就放在 /Application/Common目錄中, 可以在Common目錄下創建一個 Library目錄來放類庫. 這樣Common目錄就包括有: Common, Conf,和 Library目錄了.比如: namespace Common\Library; class Person {public function __construct(){print 'created a person'; }} 那么在 控制器的操作中, 使用的時候 , 就可以用 : $p = new \Common\Library\Person(); 來實例化一個類了.

    通常在使用類/加載類的時候,情況,都是在控制器的操作方法中。當在操作方法中, 使用new 一個類對象的時候:

  • new類名的時候, 在類路徑名稱前面加不加 反斜杠是 有區別的:
    • 不加反斜杠,表示的是 相對路徑: 總是相對于當前模塊Home的當前控制器Controller下的類;即使是 你已經定義了某個 根命名空間,如果不加反斜杠,則還是/總是在Controller控制器下: 比如: new Org\Util\Trans(), 則會認為是: \Home\Controller\Org\Util\Trans這個類
    • 如果加反斜杠, 表示的是 “根命名空間”,注意:不是根路徑,不是指項目根目錄的路徑,即不是指../Application這個路徑。
  • 因此, 如果你要實例化你 自己定義的 “根命名空間”下的類, 一定要加上這個反斜杠,表示是 根命名空間。

  • tp中的根命名空間,是有特指的,包括兩種情況:
    第一, 凡是 ThinkPHP/Library/ 目錄下的 所有 單級子目錄(注意僅僅只是指單級的子目錄,更下一級的子目錄則不是根namespace! )都是系統已 定義好了的 根命名空間, 可以直接使用;
    其次, 在模塊配置文件中 Home/Conf/config.php中, 配置的 根命名空間:

  • 在使用上,凡是要自動載入的類, 都應該從 根命名空間開始寫起: 包括:
    第一, 在定義類的時候, namespace要從根namespace寫起,但是不需要加反斜杠;
    第二, 在實例化類的時候, 也要從根命名空間寫起,而且要在前面加反斜杠.


  • ==============================

    模板注釋

    • 使用{/.../} 或 {//...} 的方式, 前者可以多行注釋, {和注釋符之間不能有空格
    • 模板注釋在緩存.php中會自動被刪除.
  • 所有不需要被模板解析的內容, 要按原樣輸出的, 都可以放在 literal標簽中

  • 使用 php本身就有的 流程控制 替代語法
    包括 for foreach while , if elseif switch 等幾個, 用: 來代替{, 用 相應的end??? 來代替 }. 就是在寫這些流程控制語句時,不用管中間

  • 的大括號就行了.
    這樣做的目的是, 在 php和html代碼混合的情況下, 更簡潔. 更易懂.
    比如:

    <?php for($i=0; $i<10; $i++): ?> // 但是要注意, 每個php語句本身還是要有 ?> 結束符 <p>輸出循環變量 <?php echo $i; ?> <?php endfor; ?><?php if($index > 10) : ?> <br>index 大于10 <?php else: ?> <br> index 小于等于10 <?php endif; ?>


    =====================================

    關于php標簽? 要使用原生的php語法,建議使用 php標簽,因為安全問題,有時候會配置 'TMPL_DENY_PHP' => TRUE,這時候就不能使用原生的php了

    用php標簽,就不能使用 模板/標簽

    ======================

  • tp中的調試
    • 錯誤調試,“錯誤就是異常” 都用 E函數來做。E($msg): 輸出錯誤信息并終止執行, 類似于die
    • 性能調試, 統一用G函數. G('begin')設置開始計時/統計內存消耗的起始點,G('end'), G('begin','end')返回計時,單位是秒. 即: G('begin','end').'s' 內存消耗: G('begin','end', 'm').
      ```
    • 使用方法:
    G('begin'); // 記錄開始標記位 // ... 區間運行代碼 G('end'); // 記錄結束標簽位 echo G('begin','end',6); // 統計區間運行時間 精確到小數后6位 echo G('begin','end','m'); // 統計區間內存使用情況 如果end標記位沒有定義,則會自動以當前作為標記位 其中統計內存使用需要 MEMORY_LIMIT_ON 常量為true才有效

    `

    模型調試 使用 $Model -> getLastSql()方法 Trace調試 要輸出頁面trace信息. 首先要開啟 'SHOW_PAGE_TRACE'=>true. 然后在頁面有模版輸出的時候就會在頁面的右下角有顯示.

    在關閉調試模式,開啟 部署模式的情況下, 如果仍然想要輸出錯誤信息 , 配置 "SHOW_ERROR_MSG =>true"

    要想在頁面的右下角輸出 頁面追蹤信息, 只需要 配置 : 'SHOW_PAGE_TRACE' => true,

    關于jquery的選擇器

    parent選擇器和方法
    :parent因為是過濾選擇器,(內容選擇器) 是對前面的元素選擇器的描述和說明,所以 它 表示 的并不是元素的父節點, 而是判斷選擇器元素是否包含子節點. 是否不為空. 即, :parent相當于 過濾器 :not-empty (只不過jquery并沒有not-empty這樣的過濾器而已, 所以就用 :parent 來表示了) 與之相對應的另一個內容選擇器是 :empty.

    要真的選擇父節點, 使用方法 parent. 要選擇所有的祖先節點, 使用 parents方法.

    將內容加粗, 可以使用 b標簽或 strong標簽. 但是他們的語義不同: b 的語義表示它只是一種格式. strong帶有強調的語義.

    jquery的很多函數,可以使用 閉包(匿名函數)做參數, 目的是: 為了滿足設置的 可變化性, 而不是固定寫死. 其中返回值就是用來設置的參數.

    wrap和unwrap的功能還是很實用的. 要在對象的 外面包裹一個標簽, 或移除一個標簽就用 wrap或 unwrap.
    wrap的時候, 標簽可以只寫開始標簽, 而不寫結束標簽. 比如可以寫 <p></p>, 也可以只寫<p>
    標簽中可以包含其他信息, 比如class, id等. 比如: <p class="foo">什么的.

    很多時候, 不管是函數的參數, 還是什么, 都需要用 字符串拼接, 以及 字符串拼接變量.

    在js, jquery中, 凡是形如key:‘value'這樣的, 一定是一個js的對象, 而不會是參數, 因為沒有哪個參數的格式會是這樣的, 所以, 既然是js對象, 在寫法上都應該給它加上大括號。比如 $.ajax, $.get等方法里面的傳遞數據.

    ajax真的其實很簡單, 就是向遠程服務器上的頁面文件傳遞數據參數, 然后接收從服務器(經過處理后)傳遞回來的數據, 最后在當前的html頁面的某個div或標簽中顯示.

    jquery中, 選擇同輩元素, 有兩種方式: 一是使用過濾器(只有 加號 +和 ~符號, 前者只能表示當前元素后面
    的元素, ~則表示前后所有的同輩) , 另一種是使用 篩選函數中的查找函數, 比如next, nextAll, prev,prevAll就可以找到之前的同輩元素了.
    要注意 同輩元素的選擇, 并不包括自己,不包括當前元素!

    要特別注意, jquery中的 同輩選擇器和同輩函數的不同: 前者 不管是 + 還是 ~ 都只能是從當前元素 向后 選擇的, 即使是 :siblings (也只會選擇從當前元素 之后 的所有 同輩元素! ),而 查找方法中的 siblings 是可以向前 向后選擇的! 選擇前后 所有的 同輩元素. 而且 + 號 和~ 后面最好要帶上 標簽, 雖然不帶標簽 也會自動查找到, 即:$('span#foo~span') 和 $('span#foo~')其實是一樣的.

    jquery中 的屬性過濾器中的 ^, $,* 等跟等號之間的 連接, 跟我們常規的 慣例的意思基本上 是一樣的, 表示開頭, 結尾, 而*星號表示通配符, 即前面的/后面的內容不管, 只要是包含的就可以!

    總結

    以上是生活随笔為你收集整理的tp框架中的一些疑点知识-5的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。