首頁 後端開發 php教程 PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-3 代码组织和_PHP

PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-3 代码组织和_PHP

Jun 01, 2016 pm 12:16 PM
代碼組織 重複使用

从本章中,我们了解

.创建可以调用的函数以便重用代码

.把参数传递给函数并且从函数返回值和脚本的不同部分中的变量和数据进行交互

.把代码和函数组存入到其他文件中,并且我们的脚本内包含这些文件.

3.1基本代码重用:函数

3.1.1 定义和调用函数

关键字function通知php这是一个函数,后面跟着的是函数的名称,它可以是字母、数字、字符或下划线

函数名称之后是参数列表,然后是函数体。在其它语言中名称相同、但是参数列表不同的函数,php不支持这一特性。
复制代码 代码如下:
function booo_spooky()
{
echo "I am booo_spooky. This name is okay!
\n";
}
function ____333434343434334343()
{
echo I am ____333434343434334343. This is an awfully
unreadable function name. But it is valid.
DONE;
}
//
// This next function name generates:
//
// Parse error: syntax error, unexpected T_LNUMBER,
// expecting T_STRING in
// /home/httpd/www/phpwebapps/src/chapter03/playing.php
// on line 55
//
// Function names cannot start with numbers
//
function 234letters()
{
echo "I am not valid
\n";
}
//
// Extended characters are ok.
//
function grüß_dich()
{
echo "Extended Characters are ok, but be careful!
\n";
}
//
// REALLY extended characters are ok too!! Your file will
// probably have to be saved in a Unicode format though,
// such as UTF-8 (See Chapter 5).
//
function 日本語のファンクション()
{
echo Even Japanese characters are ok in function names, but be
extra careful with these (see Chapter 5).
EOT;
}
?>

3.1.2 把参数传递给函数
基本语法:为了把参数传递给函数,在调用函数时需要把参数值 括在括号中,以逗号分隔。每个被传递的参数可
以是任何合法表达式,可以是变量、常量值、运算符的结果,甚至可以是函数调用。
复制代码 代码如下:
function my_new_function($param1, $param2, $param3, $param4)
{
echo You passed in:

\$param1: $param1

\$param2: $param2

\$param3: $param3

\$param4: $param4

DONE;
}
//
// call my new function with some values.
//
$userName = "bobo";
$a = 54;
$b = TRUE;
my_new_function($userName, 6.22e23, pi(), $a or $b);
?>

按引用传递:默认情况下,只有变量的值被传递给函数。因此,对这个参数或者变量的任何改动都只是在函数局部有效的
复制代码 代码如下:
$x = 10;
echo "\$x is: $x
\n";
function change_parameter_value($param1)
{
$param1 = 20;
}
echo "\$x is: $x
\n";
?>

输出: $x is :10
$x is :10
如果你的目的是函数实际地修改传递给它的变量,而不仅仅处理其值的拷贝,那么可以用引用(reference)传递的功能。这是通过使用&字符完成的

复制代码 代码如下:
function increment_variable(&$increment_me)
{
if (is_int($increment_me) || is_float($increment_me))
{
$increment_me += 1;
}
}
$x = 20.5;
echo "\$x is: $x
\n"; // prints 20.5
increment_variable(&$x);
echo "\$x is now: $x
\n"; // prints 21.5
?>

参数的默认值
在你期望参数具有支配地位的特定值的情况下,称为默认参数值(default argumentvalue)
复制代码 代码如下:
function perform_sort($arrayData, $param2 = "qsort")
{
switch ($param)
{
case "qsort":
qsort($arrayData);
break;
case "insertion":
insertion_sort($arrayData);
break;
default:
bubble_sort($arrayData);
break;
}
}
?>

可变数量的参数:
php能够把任意数量的参数传递给函数,然后使用func_num_args、func_get_arg和func_get_args取得参数值
复制代码 代码如下:
function print_parameter_values()
{
$all_parameters = func_get_args();
foreach ($all_parameters as $index => $value)
{
echo "Parameter $index has the value: $value
\n";
}
echo "-----
\n";
}
print_parameter_values(1, 2, 3, "fish");
print_parameter_values();
?>

3.1.3 从函数返回值
一些其他语言把在退出之前只执行一些代码的子例程和执行一引起代码并且把值返回调用者的函数区分开来,php和它们不同,所有php函数在返回调用者时
都有一个值和它相关联。对于没有明确的返回值的函数,返回值为null
复制代码 代码如下:
function does_nothing()
{
}
$ret = does_nothing();
echo '$ret: ' . (is_null($ret) ? '(null)' : $ret) . "
";
?>

如果希望返回非null时,利用return把它和一个表达式关联
复制代码 代码如下:
function is_even_number($number)
{
if (($number % 2) == 0)
return TRUE;
else
return FALSE;
}
?>

当你希望从函数返回多个值 时,把结果作为数组传递回来是方便的方式
复制代码 代码如下:
function get_user_name($userid)
{
//
// $all_user_data is a local variable (array) that temporarily
// holds all the information about a user.
//
$all_user_data = get_user_data_from_db($userid);
//
// after this function returns, $all_user_data no
// longer exists and has no value.
//
return $all_user_data["UserName"];
}
?>

3.1.4 函数内的变量范围
函数级别变量:
声明它们的函数内是合法,并且在函数的调用之间不记忆它们的值
复制代码 代码如下:
$name = "Fatima";
echo "\$name: $name
\n";
function set_name($new_name)
{
echo "\$name: $name
\n";
$name = $new_name;
}
set_name("Giorgio");
echo "\$name: $name
\n";
?>

静态变量:
static作为前缀的变量在函数调用之间保持它们的值不变,如果声明变量时为其赋值了,在运行当前脚本时,php只在第一次遇到这个变量时执行赋值
复制代码 代码如下:
function increment_me()
{
// the value is set to 10 only once.
static $incr=10;
$incr++;
echo"$incr
\n";
}
increment_me();
increment_me();
increment_me();
?>

脚本内声明的变量("全局变量")
复制代码 代码如下:
$name = "Fatima";
echo "\$name: $name
\n";
function set_name($new_name)
{
echo "\$name: $name
\n";
$name = $new_name;
}
set_name("Giorgio");
echo "\$name: $name
\n";
?>

l输出结果:
$name: Fatima
$name:
$name: Fatima
如果在 内部组函数加一个globa ,那么输出结果
$name: Fatima
$name: Fatima
$name: Giorgio
3.1.5 函数范围和可用性
3.1.6 把函数作为变量使用
复制代码 代码如下:
function Log_to_File($message)
{
// open file and write message
}
function Log_to_Browser($message)
{
// output using echo or print functions
}
function Log_to_Network($message)
{
// connect to server and print message
}
//
// we're debugging now, so we'll just write to the screen
//
$log_type = "Log_to_Browser";
//
// now, throughout the rest of our code, we can just call
// $log_type(message) and change where it goes by simply
// changing the above variable assignment!
//
$log_type("beginning debug output");
?>

但是php包含很多不能用作变量函数的语言结构,这种结构的明显例子是echo、print、var_dump、print_r、isset、unset、is_null is_type
3.2 中级代码重用:使用和包含文件
3.2.1 把代码组织到文件中
对通用功能进行分组: 如果希望把很多函数保存到单一位置上,典型情况是一个文件,即代码库(code library)
生成一致的接口
复制代码 代码如下:
// circle is (x, y) + radius
function compute_circle_area($x, $y, $radius)
{
return ($radius * pi() * pi());
}
function circle_move_location(&$y, &$x, $deltax, $deltay)
{
$x += $deltax;
$y += $deltay;
}
function compute_circumference_of_circle($radius)
{
return array("Circumference" => 2 * $radius * pi());
}
?>

通过使用这此函数具有一致的名称、参数顺序以及返回值 ,可以显著地减少失败的可能性和代码中的缺陷。
复制代码 代码如下:
//
// all routines in this file assume a circle is passed in as
// an array with:
// "X" => x coord "Y" => y coord "Radius" => circle radius
//
function circles_compute_area($circle)
{
return $circle["Radius"] * $circle["Radius"] * pi();
}
function circles_compute_circumference($circle)
{
return 2 * $circle["Radius"] * pi();
}
// $circle is passed in BY REFERENCE and modified!!!
function circles_move_circle(&$circle, $deltax, $deltay)
{
$circle["X"] += $deltax;
$circle["Y"] += $deltay;
}
?>

3.2.2 选择文件名和位置
为了防止web用户打开.inc文件,我们使用两种机制防止这种情况发生,首先,在构成文档目录树中,我们确保web服务器不允许用户浏览或者加载
不希望他们进行这些操作,在16章保护web应用程序中介绍,然后,然后将配置浏览器允许用户浏览.php和.html文件,但是不能浏览.inc文件
防止这种问题的第二个途径不把代码入在文档树中,或存入其它目录,并且要么明确地在我们的代码中引用这个目录,通知php总是查看这个目录
3.2.3 在脚本中包含库文件
include 和require,这两个区别在于,当找不到文件时,require输出错误,而include输出警告。
复制代码 代码如下:
include('i_dont_exit.inc');
require('i_dont_exit.inc');\
?>

include和require在哪里查找文件
你可以指定明确的路经:
require("/home/httpd/lib/frontend/table_gen.inc');
require('http://www.cnblogs.com/lib/datafuncs.inc');
require(d:\webapps\libs\data\connetions.inc');
如果没有指定明确路径,php就在当前目录中查找要包含的文件,然后查找php.ini文件中的include_path设置中列出的目录.
在windows是include_path=".;c:\php\include;d:\webapps\libs“设置完成后,不要忘记重新启动web服务器。
include和require做了什么
包含在脚本标记中的任何内容都作为一般 php脚本处理。
清单3-1和清单3-2显示php脚本和用于包含的简单文件
清单3-1
3.2.4 把包含用于页面模板化






清单3-2
复制代码 代码如下:


Sample


$message = "Well, Howdy Pardner!";
include('printmessage.inc');
?>



文件包含和函数范围
当把函数从脚本移动到包含文件时,会如何影响函数作用范围及调用它们的能力。
如果一个函数在另一个文件中,并且这个文件没有通过include和require包含在当前脚本中,那么调用是非法的
为了避免这个问题,在脚本开头包含其他文件是个好主意。
当共享变成问题时
为了避免重复加载共享文件,可以用require_once()和include_once()语言结构防止函数或者结构重复定义的问题
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1654
14
CakePHP 教程
1413
52
Laravel 教程
1306
25
PHP教程
1252
29
C# 教程
1225
24
PHP8新功能範例:如何利用命名空間和程式碼來更好地組織程式碼結構? PHP8新功能範例:如何利用命名空間和程式碼來更好地組織程式碼結構? Sep 11, 2023 pm 12:22 PM

PHP8新功能範例:如何利用命名空間和程式碼來更好地組織程式碼結構?引言:PHP8是PHP程式語言的重要版本,它引入了許多令人興奮的新特性和改進。其中一個最重要的新功能是命名空間(namespace)。命名空間是一種將程式碼組織成更好結構的方法,它能夠避免相同名稱的類別、函數和常數之間的衝突。在本文中,我們將介紹如何利用命名空間和程式碼來更好地組織PHP8程式碼的結構

如何在Java中利用強制繼承代理final類別來實現更好的程式碼組織和管理? 如何在Java中利用強制繼承代理final類別來實現更好的程式碼組織和管理? Sep 06, 2023 am 11:24 AM

如何在Java中利用強制繼承代理final類別來實現更好的程式碼組織和管理?在Java中,final類別是指不能被繼承的類別。通常情況下,我們將一個類別聲明為final是為了保證其行為的穩定性和安全性。然而,有時候我們希望在使用final類別時能夠進行一些額外的操作,例如新增日誌記錄、權限驗證等。這時,我們可以利用強制繼承代理final類別的特性來實現更好的程式碼組織與管理

學習JavaScript中的程式碼組織和模組化開發 學習JavaScript中的程式碼組織和模組化開發 Nov 03, 2023 pm 03:57 PM

隨著網路的普及和應用的日益多樣化,前端開發人員的技能要求也越來越高,其中JavaScript是前端開發人員必須精通的程式語言。 JavaScript不僅用於網頁互動、動態效果實現,同時也廣泛用於Node.js等後端開發。在開發JavaScript應用程式時,如果不注意程式碼的組織和模組化的開發方式,往往就會造成程式碼解耦度低、難以維護的問題。因此,學習Jav

Java 中的程式碼組織和模組化設計技術 Java 中的程式碼組織和模組化設計技術 Jun 09, 2023 pm 02:35 PM

在軟體開發過程中,程式碼組織和模組化設計是極為重要的一環。它們不僅可以使程式碼更加易於維護和擴展,還可以提高程式碼的可重複使用性和程式碼品質。在Java中,程式碼組織和模組化設計技術也非常重要,本文將會介紹Java中的常見程式碼組織和模組化設計技術。一、包和命名空間在Java中,包是一種用於組織類別的機制,可以將類別分組,並防止命名衝突。包中可以包含子包和類別。包名之

如何解決Python的程式碼中的函數長度不合適錯誤? 如何解決Python的程式碼中的函數長度不合適錯誤? Jun 24, 2023 pm 09:46 PM

Python是一種程式語言,其程式碼的重要組成部分是函數。當編寫函數時,可能會遇到一個常見錯誤,即函數長度不合適錯誤,這可能會導致可讀性的降低,維護成本的增加以及其他問題。本文將討論如何解決Python程式碼中的函數長度不合適錯誤。首先,需要了解函數長度不合適錯誤的原因。通常,如果一個函數的長度過長,它可能難以理解、測試和維護。另一方面,如果函數巢狀層數

如何使用繼承創建可重複使用的PHP類 如何使用繼承創建可重複使用的PHP類 Aug 02, 2023 pm 07:19 PM

如何使用繼承創建可重複使用的PHP類繼承是物件導向程式設計中的一個重要概念,它允許我們建立一個類別,該類別繼承了另一個類別的屬性和方法。透過繼承,我們可以創建可重複使用的程式碼,提高程式碼的複用性,並節省開發時間。本文將介紹如何使用繼承建立可重複使用的PHP類,並透過程式碼範例進行說明。父類別與子類別在繼承中,我們通常有一個父類別和一個或多個子類別。父類別通常包含一些共享屬性和方法,子類別透過繼承

PHP MVC 架構的禪宗:掌握平衡與和諧 PHP MVC 架構的禪宗:掌握平衡與和諧 Mar 03, 2024 am 09:28 AM

在軟體開發的世界中,mvc架構已成為建立可維護且可擴展應用程式的典範。對於PHP開發人員來說,MVC架構提供了結構和組織的框架,使他們能夠編寫可重複使用、可測試和可維護的程式碼。 MVC架構的原則MVC架構(Model-View-Controller)是一種設計模式,它將應用程式的邏輯分解為三個獨立的元件:模型:表示應用程式的資料和業務邏輯。視圖:負責顯示應用程式的資料。控制器:協調模型和視圖之間的交互,管理使用者請求。 PHP中的MVC架構在php中實作MVC架構時,通常會遵循以下結構://模型類別class

分離與征服:釋放 PHP 命名空間的強大潛力 分離與征服:釋放 PHP 命名空間的強大潛力 Mar 10, 2024 am 09:10 AM

PHP命名空間是一種強大的機制,可用於組織和管理類別、函數和常數,從而提高程式碼可維護性、可讀性和可重複使用性。透過將相關的程式碼元素分組到命名空間中,我們可以有效地避免名稱衝突,促進程式碼重複使用並簡化自動載入過程。避免名稱衝突在大型應用程式中,很容易建立具有相同名稱的類別或函數。這會導致名稱衝突,從而使得確定要使用哪個版本變得困難,甚至導致程式碼錯誤。命名空間可以有效解決這個問題。透過使用不同的命名空間,我們可以將具有相同名稱的程式碼元素分隔開來,從而確保它們彼此獨立地工作。示範代碼://命名空間1namesp

See all articles