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小时内与您取得联系。