thinkphp一句話疑難解決筆記 2


php中的_ _call()方法?
它是php5后為對象 類 新增的一個自動方法. 它會監視類的其他方法的調用, 當調用類的不存在的方法時, 會自動調用類的__call方法. tp的 "命名范圍調用"就是使用的 __call機制.如$User->scope_name()->select(); 它帶兩個參數,第一個是 調用的不存在方法的名稱$funcName, 第二個參數是 由不存在方法的參數 組成的一個數組$args. **特別注意的是, __call要定義為 public 訪問級別,即使是 本 類的方法 來調用... Error: Access level to Home\Controller\IndexController::__call() must be public(as in class Think\Controller) **

php類中的特殊成員和特殊方法?
特殊成員用一個下划線表示, 如$_validate... 特殊方法用兩個下划線表示,如function __construct, __call() __destruct等. 這些特殊成員 通常不會直接調用, 而是作為"隱式"的東西被 "自動"使用.

使用命名范圍scope, 是一個比較好的思想,可以 簡化 連貫操作的多次書寫...

總結, tp的選擇操作方式有四種:

  1. 傳統的query方法;(相應的,execute是寫操作方法...)
  2. orm方法: $User->field('name, score')->table('score')->where('class=一班')->select(); //包括scope方法.
  3. 動態查詢方式: $User->getById('10'); $User->getFieldById('score', '10');
  4. AR方式查詢: $User->find('8'); $User->select('1,2,10'); 所有的操作(包括查詢, 賦值,修改等)都是通過對象 $User->score=100; $User->id=10; $User->save();
    實際應用中, 在滿足要求 的情況下, 用最簡單 的方式

設計數據庫時, 參考"11個重要的數據庫設計規則" Website: http://kb.cnblogs.com/page/138526/,  英文原文: 11 Important Database designing rules syllabus: 課程
3nf: normal formum. jiushi : 原子性(根據實際需要來確定,不一定越細越好, 如果過多使用substr,則不是合適的...), 完全依賴主鍵而不是部分依賴; 控制派生列(存在依賴非主鍵的列, 如統計列, avg,sum等列, 也就是控制 冗余, 也不是絕對的, 如果為了性能, 可以適當冗余). 解決denormalization 扁平化處理的方法是: 將不符合3nf的數據,包括 不符合1nf 2nf的列, 提取出來,單獨建一個表, 然后通過外鍵 關聯.

many_to_many時, 要通過中間表進行關聯, 中間表一般包含表自己的自增id字段(這個不是必須的), 兩個表的主鍵字段.在tp中中間表的命名規則是: 表前綴_主表_關聯表.

在設計表字段結構時, 應盡量避免使用NULL字段. NULL字段會額外增加存儲空間, 而且mysql對null字段會做一些特殊工作,不會對null字段進行索引, 所以,這些都是不利因素, 除非你確實要存儲null值, 否則, 都應該顯示的聲明字段為not Null.

通常情況下,模型類是不需要自己定義的,除非你要 在模型中使用自己的業務方法, 使用其他附近功能和規則,如$_validate, $_link等.

一般主鍵字段,不要光光的只寫一個id, 最好是把前綴都帶上,如uid, gid, article(aid)等.

namespace是指當前定義的類所在的文件, 所在的目錄, use是指你要繼承的基類所在的文件路徑(不帶.class.php后綴的)

表的別名不用as嗎, 字段的別名才用as?

thinkphp的D,M方法的對象$User, 本身是一個Model對象, 其中包含了很多 成員 屬性, 所以才可以用 -> 方式輸出字段屬性的值,和用AR的方式來add,save等. 但是,如果要得到$User->select后的結果數組, 則要用另外的變量去接受它. 如$result = $User->select(), 這樣$result就是數組了.

關於stdClass?
stdClass是php的保留類是頂層基類,本身無屬性和方法,是所有類的派生的開始.當你需要傳遞屬性而又不需要很正式的例如class SomeClass extends...方式來定義類時,就可以這樣使用stdClass.(注意php的類不可以動態地添加方法, 所以$obj=new stdClass()后, 只能有$obj->attr='some', 而不能有$obj->method();)

php的對象都是指針, 傳值/傳參/調用時都是地址引用,即使像$obj2 = $obj1, 這樣也是傳地址引用, 可以節省資源,是直接修改對象本身,而不是拷貝. (而數組傳值時,是另外生成一個拷貝,而且unset(數組)仍然占用內存 )

編輯器的代碼 字體大小, 9-10就比較合適了, 大了反而不合適

thinkphp用戶自定義的 函數, 文件/庫的名稱, 一定是 function.php, 否則不能自動加載, 在Controller中就不能直接使用. 不能使functions.php, 這個 functions.php是框架的 函數庫, 是為了跟用戶自定義函數庫相區別的!!

關於3.2.3中使用namespace后,出現的找不到類stdClass的問題?

使用namespace后, 默認的,你就只能使用 \home\Controller目錄下的類/函數了.這也正是 命名空間的功用. 但是你也不能把像new stdClass()之類的語句放到namespace前面去, 因為"namespace declaration statement has to be the very first statement in the script". 你也不能在Home\Common\function.php中去定義class stdClass, 因為他會報重復聲明: redeclare. 解決方案是: 在命名空間中,要使用: 1. 要使用php的內置類, 或其他第三方沒有使用命名空間的類, 要使用 反斜杠 "" 引起, 表示 php的根空間. 2.如果要使用其他有命名空間的類, 則使用import或vendor方法...

在windows下, 是不區分stdClass的大小寫的, 也不區分是否加()號. 如$obj = new \sTDcLass;是可以的.


在App/Runtime/Cache/Home目錄中保存的緩存文件是控制器的方法,還是View視圖的模板?
只有 當方法中 調用show,和display方法時, 才會生成緩存文件,也就是說,可以認為cache下的緩存是針對視圖模板文件的,如果沒有模板,即使在方法中寫再多的東西都不會生成緩存文件的.

DATA_PATH, 是存儲文件數據(緩存)的位置,在 ./Application/Runtime/Data/下

函數中的對齊,通常只是針對 “(可以是 任何位置)多個挨着的 賦值語句,才考慮等號對齊”

S和F的區別?
S緩存 主要是用在頻繁在服務器端需要使用的數據且不會頻繁更新的, S是保存在服務器內存中的,所以你在DATA_PATH.'data/'下是看不到文件的.F則是以緩存文件的方式保存的. $data="123"; F('passwd', $data);echo F('passwd');

客戶端/瀏覽器, 是以 "其他, other" 來訪問服務器的, 絕不是以root, 也不是以apache身份來訪問的. 因為在linux下要能夠順利地運行thinkphp的話, 要 將Application的權限設為 other+w, (不一定設為777), 最重要的是, 要把 selinux設置好, 或者 把selinux禁用掉. 有時,也要考慮防火牆的問題.

linux下, 使用<php>....</php> 標簽時,提示, used undefined function \Think\Template\simplexml_load_string(), 是因為沒有安裝 php-xml包...

在convention.php中, 雖然配置了 'SHOW_ERROR_MSG => false, 和 ERROR_MESSAGE => '...' `, 但是由於 配置了 'APP_DEBUG => true', 所以要加載 Conf/debug.php, 因此, debug.php中的配置 'SHOW_ERROR_MSG' => true 把前面的配置給覆蓋了. 而convention.php中的配置正好是 在部署時的配置.


異常中的trace?
是在 出現異常時, 頁面中加入trace信息, 不同於專門的 頁面trace設置

在thinkphp中, 是把 錯誤 = = = 異常, 把錯誤當作異常來處理的, exception=error

頁面trace?
是指在頁面右下角出現一個圖標,然后可以點擊查看, 基本,文件,debug, sql等頁面trace 調試信息... 需要設置 'SHOW_PAGE_TRACE' => true, 'TRACE_PAGE_TABS'=>array(..),...

trace方法?
則是手動的/自定義的, 你想輸出/查看 什么信息的 輸出一些 變量信息, 它是要結合 頁面trace來使用的, 因為, trace(你要查看的變量$var/$sql等變量, '條目行 標簽', '指定 屬於的, 顯示在其下的 ,要在頁面trace上顯示的分類標簽'). 默認的是顯示在 debug標簽下. 所以, 如果你沒有設置頁面trace, 你是看不到的.

總之,這些trace其實是沒有多少用的, 真的要 調試的話, 直接就 dump了


套路: 表前綴通常用數據庫名, 模型對象名稱就用對應的表名稱. 作用是 方便, 清晰。

對於函數, 一般都是return $var; 返回一個變量, 並不返回“return echo $var”, 這樣方便你自己使用, 你可以用echo去輸出, 也可以用於 表達式中使用。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com