PHP中有兩個引入文件的語言結構:include、require
1、注意這兩個都是語言結構不是方法,與echo、print、isset()、empty()、unset()等類似都是語言結構不是函數!!!!!
2、include與require都是引入外部文件到當前上下文環境,但是他們有一些區別:
一、被包含文件先按參數給出的路徑尋找,如果沒有給出目錄(只有文件名)時則按照 include_path 指定的目錄尋找。如果在 include_path 下沒找到該文件則 include 最后才在調用腳本文件所在的目錄和當前工作目錄下尋找。如果最后仍未找到文件則 include 結構會發出一條警告;這一點和 require 不同,后者會發出一個致命錯誤。(在這點上include_once與require_once類似,但是他們在導入一個已導入的文件都會忽略,但是他們在引入文件時會判斷是否引入會降低性能)
二、關于引入的文件:當一個文件被包含時,其中所包含的代碼繼承了 include、require 所在行的變量范圍。從該處開始,調用文件在該行處可用的任何變量在被調用的文件中也都可用。不過所有在包含文件中定義的函數和類都具有全局作用域。
EG1:
vars.php
<?php
$color = 'green';
$fruit = 'apple';
?>
test.php
<?php
echo "A $color $fruit"; // A
include 'vars.php';
echo "A $color $fruit"; // A green apple
?>
如果 include 出現于調用文件中的一個函數里,則被調用的文件中所包含的所有代碼將表現得如同它們是在該函數內部定義的一樣。所以它將遵循該函數的變量范圍。此規則的一個例外是魔術常量,它們是在發生包含之前就已被解析器處理的。
3、include返回值:
處理返回值:在失敗時 include 返回 FALSE 并且發出警告。成功的包含則返回 1,除非在包含文件中另外給出了返回值。可以在被包括的文件中使用 return 語句來終止該文件中程序的執行并返回調用它的腳本。同樣也可以從被包含的文件中返回值。可以像普通函數一樣獲得 include 調用的返回值。不過這在包含遠程文件時卻不行,除非遠程文件的輸出具有合法的 PHP 開始和結束標記(如同任何本地文件一樣)。可以在標記內定義所需的變量,該變量在文件被包含的位置之后就可用了。因為 include 是一個特殊的語言結構,其參數不需要括號。在比較其返回值時要注意。
EG2:
<?php
// won't work, evaluated as include(('vars.php') == TRUE), i.e. include('')
if (include('vars.php') == TRUE) {
echo 'OK';
}
// works
if ((include 'vars.php') == TRUE) {
echo 'OK';
}
講解:
$bar 的值為 1 是因為 include 成功運行了。注意以上例子中的區別。第一個在被包含的文件中用了 return 而另一個沒有。如果文件不能被包含,則返回 FALSE 并發出一個 E_WARNING 警告。如果在包含文件中定義有函數,這些函數不管是在 return 之前還是之后定義的,都可以獨立在主文件中使用。如果文件被包含兩次,PHP 5 發出致命錯誤因為函數已經被定義,但是 PHP 4 不會對在 return 之后定義的函數報錯。推薦用 include_once 而不是檢查文件是否已包含并在包含文件中有條件返回.
3、include引入文件的處理:(這點很重要)
當一個文件被包含時,語法解析器在目標文件的開頭脫離 PHP 模式并進入 HTML 模式,到文件結尾處恢復。由于此原因,目標文件中需要作為 PHP 代碼執行的任何代碼都必須被包括在有效的 PHP 起始和結束標記之中。并且當執行完成之后直接加入到緩沖區,將被導入的文件中的變量加入到當前的作用域變量鏈上。
EG3:
//t1.php 文件內容
1234<?php $name="PQS"; ?>5678<?php return 1; ?>9
//t2.php文件內容
<?php
include "t1.php";
echo $name;
//開始執行t2.php
會輸出:12345678PQS
案例解析:
首先當include "t1.php";文件時PHP解析器脫離PHP模式進入HTML模式開始解析,因為HTML模式是將內容直接加入到緩沖區,所以沒有標簽1234會被首先加入到緩沖區,然后在執行<?php $name="PQS"; ?>這里就會把$name這個變量加入到t2.php的include "t1.php"這句代碼的上線文變量作用域中。然后接著在回到HTM模式將5678加入到緩沖區,接下來遇到<?php return 1;?>就開始進入PHP模式進行執行代碼,因為include是接受return的,所以當這里return 1之后整個文件的加載就到此處結束了, 返回到t2的代碼執行域中了,這也是為什么最后沒有輸出9的原因。
舉個例子證明PHP將文件輸入到緩沖區:
//t3.php
1234567
//t4.php
<?php
$string = get_include_contents('t3.php');
function get_include_contents($filename) {
if (is_file($filename)) {
ob_start();
include $filename;
$contents = ob_get_contents();
ob_end_clean();
return $contents;
}
return false;
}
echo $string;
//執行t4.php
1234567
案例分析:
函數get_include_contents($filename)
在include之前開啟緩沖區,當include將t3.php文件引入后就使用ob_get_contents()方法獲取緩沖區數據賦值給$contents,然后使用ob_end_clean將緩沖區數據丟棄最后將$contents返回,最后輸出返回值就是t3.php在經過php運行的值。
4、include支持引入URL:
如果“URL include wrappers”在 PHP 中被激活,可以用 URL(通過 HTTP 或者其它支持的封裝協議——見支持的協議和封裝協議)而不是本地文件來指定要被包含的文件。如果目標服務器將目標文件作為 PHP 代碼解釋,則可以用適用于 HTTP GET 的 URL 請求字符串來向被包括的文件傳遞變量。嚴格的說這和包含一個文件并繼承父文件的變量空間并不是一回事;該腳本文件實際上已經在遠程服務器上運行了,而本地腳本則包括了其結果。
<?php
/* This example assumes that www.example.com is configured to parse .php *
* files and not .txt files. Also, 'Works' here means that the variables *
* $foo and $bar are available within the included file. */
// Won't work; file.txt wasn't handled by www.example.com as PHP
include 'http://www.example.com/file.txt?foo=1&bar=2';
// Won't work; looks for a file named 'file.php?foo=1&bar=2' on the
// local filesystem.
include 'file.php?foo=1&bar=2';
// Works.
include 'http://www.example.com/file.php?foo=1&bar=2';
$foo = 1;
$bar = 2;
include 'file.txt'; // Works.
include 'file.php'; // Works.
此案例是PHP官網案例,如果不懂之處請移步值PHP官網include章節!
長文創作激勵計劃#
模板不僅僅是靜態的HTML,在渲染的過程中經常包含著一部分變量。在Django中,通過一個類似字典的對象context,把所有模板中需要用到的變量從view傳遞到template。比如搜索結果列表和推薦列表顯示樣式和顯示信息都一樣,此種情況下,若模板根據不同變量顯示不同數據的方式進行頁面的渲染,則需要創建不同的模板進行顯示,會做很多重復性的工作,并造成代碼的冗余和結構的繁雜。在模板中使用變量的便利遠不止此,例如還可以根據傳遞變量類型或者值得不同顯示不同的樣式和信息。
[!TIP]
與其它語言不同的是,在Django中,view中的變量不會自動在template中可用,必須通過view準確傳遞到template中,這樣設計的目的是為了避免破壞模板的命名空間。
和其它語言PHP、Vue中的用法一樣,Django的模板中的變量也是通過{{ }}進行表示,例如顯示變量name:{{ name }}。即使變量中包含一些特殊字符(如:<),也不需要擔心會影響顯示結果,因為Django的也會自動避免將其以HTML的形式進行顯示。
[!NOTE]
如果在模板中用到了沒有傳遞的變量,Django只會在相應位置不做任何顯示,而不會拋出異常。
示例:
1、以my_site項目為例,在Django應用myapp中創建templates文件夾,并在文件夾內創建welcome.html文件,其結構和內容如下:
示例結構
2、修改views.py文件,在其中添加welcome方法,其內容如下:
from django.http import HttpResponse
from django.shortcuts import render
# Create your views here.
def welcome(request):
name="World"
return render(request, "welcome.html" ,{"name":name})
3、在myapp中的urls.py進行配置,其內容如下:
from django.contrib import admin
from django.urls import path
from .views import welcome
urlpatterns = [
path('welcome/', welcome, name="welcome"),
]
4、修改my_site項目的urls.py文件,引用myapp中的urls.py,其內容如下:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path("", include("myapp.urls")),
]
5、通過python manage.py runserver命令運行項目,其顯示如下:
示例效果圖
該文章作為學習筆記進行分享和記錄,如有錯誤或其它觀點,請多多指教!!!
會創建一個 SEO 友好的 URL 只需要幾分鐘,但學會之后的好處,遠不只有一個。
一個 SEO 友好的 URL 要易于理解和記憶,能提高用戶點擊或分享的機會,也能提高網站的可見性;當你在 URL 中添加了關鍵詞,還能幫助搜索引擎去了解該頁面的主題,有利于搜索排名。
在《外貿獨立站域名挑選指南【2023】 | 慢慢來數字營銷》一文中,我們提到了 URL(uniform resource locator)與域名之間的關系,域名是URL的組成部分。在《外貿谷歌SEO入門:長文+思維導圖 | 慢慢來數字營銷》這篇文章里也簡單介紹了站內SEO的 On-Page SEO 包含很多要素,其中一個就是 URL 。
來源:SERanking
SEO 友好的 URL 能幫助網頁獲得一個良好的排名。什么樣算 SEO 友好的 URL 呢?其實很簡單,就是對用戶友好的,能提高用戶體驗的 URL 。
URL 真能有這么大的幫助嗎?谷歌真的看重 URL 嗎?
谷歌還是很在乎的,畢竟 SEO入門指南還專門給了 URL 一個板塊:
既然這么重要,對用戶友好的,能提高用戶體驗的 URL 怎么創建呢?
URL(uniform resource locator,統一資源定位符),是用于在互聯網上定位資源的唯一標識符,指向特定網站、網頁或文檔,就是我們俗稱的網頁地址。
URL 由很多部分組成,一個簡單的示例 URL 拆解如圖:
來源:ahrefs
雖然創建 SEO 友好的 URL 很有必要,但不建議大家去對現有的 URL 進行大幅度的改動,我們應該專注于接下來每一個新的博客、新的網頁的 URL。
1、slug 部分的優化
前文提到了 Slug 的重要性,作為 URL 里關鍵的一部分,也是包含該個網頁內容關鍵詞的地方。
雖然近幾年也有一種說法:在 URL 里包含關鍵詞對排名的影響并不大。谷歌的 John Mueller 多次對此進行聲明:
那是不是在“URL 中包含關鍵詞”是一個沒必要去優化的因素呢?
首先,谷歌官方肯定了做好 URL 的優化是有用的,雖然是一個很小的因素,但是我們要做好這個細節只需要花幾秒鐘,畢竟 SEO 就是由無數個優秀的小細節組成的。
這點,谷歌的 Matt Cutts 在一個視頻中也有提到:
在視頻中,Matt Cutts 也提到了一個清晰簡潔的 URL 對提高用戶體驗的重要性,視頻里著重強調了用戶體驗。
其實,這也提醒我們,在優化 URL 的 Slug 部分時,簡潔有重點(關鍵詞)才是我們應該做的。
優化 Slug 可以從這幾方面入手:
Slug 不要太長,其實也等同于 URL 不要設置得太長,越短的 URL ,谷歌搜索引擎更容易索引到網頁的主題。Backlinko 做過一個實驗發現, URL 越長,在谷歌上的排名越下降:
來源:Backlinko
來源:hubspot
2、選擇一個好的域名和頂級域名(后綴)
域名、頂級域名(后綴)對于SEO的影響這一點我們在《外貿獨立站域名挑選指南【2023】 | 慢慢來數字營銷》一文中已經講解的很詳細,這里也不再贅述。
谷歌表示:如果你的網站是多區域網站,建議考慮使用一種便于對網站進行地理位置定位的網址結構。
3、HTTPS 協議
HTTP 和 HTTPS 的區別咱們之前也聊到過,這點可以著重看看這篇文章:《5分鐘教你搞定HTTPS!(附免費SSL證書申請流程) | 慢慢來數字營銷》:
來源:neilpatel 博客
而作為 URL 的一部分,HTTPS 也是谷歌衡量排名的一個因素:
4、子文件夾 > 子域名
外貿獨立站不要使用子域名!
外貿獨立站不要使用子域名!!
外貿獨立站不要使用子域名!!!
重要的事情應該多說幾遍。開頭咱們就提到,子域名是位于主域名之外的,被認為是一個單獨的網站;而子文件夾(相當于子目錄)其實就等于是網站里的一個頁面,是網站的一部分。舉個例子:
子文件夾:mmldigi.com/blog/
子域名:blog.mmldigi.com
mmldigi.com/blog/是mmldigi.com 的一部分,但 blog.mmldigi.com 是獨立于 mmldigi.com 之外的。這就意味著谷歌在對 mmldigi.com 這個主域進行排名的時候,是不會考慮 blog.mmldigi.com 上面的內容的,但 mmldigi.com/blog/ 就不會有這樣的情況。
谷歌官方有個對外說法:
但現實的情況是,有很多從事 SEO 方面工作的人表示:呵呵!
GetCredo 的創始人 Jonn Doherty 曾在社交媒體上表示:
從事相關工作的 Craig Emerson 也專門做過研究,表示:
我只需將子域名改為子目錄,就能從前列 100 名開外的某處(我知道我甚至沒有進入前 200 名)躍升至 SERP 排名第 57 位。與我的網站相關的其他一切都保持不變。
當然,子文件夾(子目錄)也并非是絕對的選擇,比如一些大型的電子商務網站,也有因為技術原因而無法選擇子文件夾的情況。
不過對于做外貿獨立站的朋友們來講,我們上千個獨立站項目的切身經歷得出來的結論就是:外貿獨立站不要使用子域名!
我們曾經有個項目,客戶因為考慮到公司的目標市場情況,堅持選擇子域名,但結果就是,同等的資源傾斜上去,表現真的還不如 .www 。雖然后面網站問題順利解決了,但是這期間的損失還是很可惜的。
還有一點是,選擇子文件夾的話,大家要注意子文件夾的關鍵詞不要跟 Slug 重復。重復的關鍵詞沒有必要且影響用戶觀感。
5、避免使用日期
這跟前面提到不要有數字很相似。避免使用日期有兩個原因:
6、不要輕易修改 URL
這個其實很好解釋:
URL 對于 SEO 很有幫助,但這并不代表我們只要搞定了 URL 就是做好了 SEO 的優化,SEO 優化涉及的內容很多,只有方方面面都做到細致,才能讓網站有更好的排名。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。