PHP基础总结
我是一名从零开始,经过半年的PHP实践的初级工程师。这篇文章是为了整理我在实践和学习中所学到的内容而写的。(学习内容是基于山浦清透先生的自学工程师网站所学而输出的。对于想掌握作为一名工程师的基础能力的人来说,我强烈推荐这篇文章。)如果您是PHP初学者,欢迎参考。
在实际工作中所需的态度(三个)
-
- 只编写能理解的代码
-
- 只靠复制粘贴能运行并不意味着在出现障碍、问题或错误时能够解决。
编写易读的代码
功能的追加和修改是必然的。在这种情况下,必须编写一目了然的代码才能进行相应的修改。
(考虑了团队开发和未来发展吗?)
编写易变更的代码
不仅是应急代码,而是编写易于修改功能、具有高扩展性的代码。
(考虑了操作方式吗?)
※面向对象的设计方法能够实现代码的改变和扩展
PHP:变量
在中文中产生变量。
技术是为了解决问题而创建的。
为了正确地运用技术,了解技术产生的解决方案的目的是非常重要的。
通过了解变量的生成方式,目标是能更好地使用变量。
在引入变量名称的概念之前
在没有姓名概念的时代,使用存储器中的“数值”进行识别。
(例如)
在25号地址保存书名的数据。从25号地址中提取书名的数据。
在26号地址保存作者名的数据。从26号地址中提取作者名的数据。
[24号地址] [25号地址] [26号地址] ・・・
必须记住在哪个地址存储了什么数据。
为了使代码更易于读写…
为了增加可读性,决定在内存空间的地址位置上贴上类似’name’的标签。
(例)
[24号地址(’##’)] [25号地址(’name’)] [26号地址(’author’)] ・・・
将书名数据保存在’name’中。从’name’中提取书名数据。
将作者数据保存在’author’中。从’author’中提取书名数据。
通过贴上标签,一眼就能看出保存了哪些数据,从而使代码的阅读和编写变得更加容易。
变量是将值存储在每个内存区域,并标记每个区域的标签。
(为了使代码易于阅读,变量名称应该起一个易于理解含义的名字,这很重要)。
变量的行为
$a = 'abc';
$b = $a;
$c = &$a;
$a[0] = 'z'; //$aの1文字目を'z'に変更
echo $a . PHP_EOL; //出力結果:zbc
echo $b . PHP_EOL; //出力結果:abc
echo $c . PHP_EOL; //出力結果:zbc
「リファレンス」とは什么意思?
在PHP中,变量名和变量的内容是分开存在的。对于相同内容的值,可以有多个不同的名称。
更换另一个名字。
$c = &$a; // 'abc'の値に、$aと$cという変数名のラベルを貼っている
在变量前加上&符号进行赋值时,指向引用的地址会被赋值。
引用:指代别名(类似昵称的东西)
在对常规变量进行赋值时发生的事情
$b = $a; // $aからコピーした'abc'という値を$bに入れている
由于变量$a和$b是不同的,因此修改$a的值不会改变$b的值。
在通常的变量赋值中,被赋值的是”表达式”。
$b中已经被赋值了一个表达式(\$a)。
表达式:包含所有有值的元素。
变量的作用域
仅仅给变量起了个名字的问题
对于只是命名的变量实际上存在问题。
这个问题是什么以及如何解决的故事。
如果变量的名称与变量的内容在整个程序中是一对一的关系,会出现名称冲突。(只有在全局作用域中才会出现名称冲突)
避免姓名冲突
为了避免变量名称的冲突,人们引入了一个被称为“作用域”的概念。
通过准备本地作用域并限定名称的有效范围,确保名称不会重复。
将其分为各自独立的映射表,以便每次函数调用时使用。
PHP的作用域 (PHP de zuoyongqu)
在PHP中,有全局作用域和局部作用域。
$num = 0; //グローバルスコープ(有効範囲がプログラム全体)
function call() {
$num = 0; //ローカルスコープ(有効範囲が関数やクラス内)
}
请注意:如果想在函数内使用全局范围的变量,则需要通过函数的参数进行传递。
补充说明:局部范围的有效范围因语言而异。
在定义变量时,重要的是根据名称的有效范围来考虑定义位置。
预定义变量
在中文中,定义好的变量有两种类型。
已定义的变量
在PHP中,变量会在运行时自动定义。
超级全局变量
任何作用域均可使用的全局变量。
PHP:常量
在运行过程中无法更改值的是常量。
为什么会诞生常数?
有时候仅仅使用变量是不够的,因此常数应运而生。
下面的代码是一个只使用变量会有困难的情况的示例。
(仅使用变量时,不希望被修改的值也可能被修改)
$tax = 0.1;
$price = 100 * (1 + $tax);
echo $price . PHP_EOL; // 110
// 別の箇所で気づかずに $tax に別の値を代入してしまったら$priceが正しくない結果になってしまう
$tax = 0.08;
$price = 100 * (1 + $tax);
echo $price . PHP_EOL; // 108
数的性质
-
- 一度設定されると再定義または未定義にできない
-
- 変数のスコープに関係なく、どんな場所からでもアクセス可能
- 前に$記号がいらない
定数的定义
-
- constキーワードの後に指定することで定数を定義できる
- ※トップレベルのスコープで定義する必要がある(関数やif文やループの中では宣言できない、ブロックの外側で宣言する必要があるという意味)
const TAX = 0.1 // 慣習的に常に大文字で定義される(変数と見分けをつけるため)
$price = 100 * (1 + TAX);
echo $price . PHP_EOL; // 110
// 後から定数の値を変更することはできない
TAX = 0.08; // syntax error
$price = 100 * (1 + $tax);
echo $price . PHP_EOL;
const TAX_RATE= 0.1 // 複数単語の場合は _ で繋げる
在使用常数的场景中,主要有三个。
-
- 当我们不想更改数值时
-
- 当我们希望给数值赋予意义时
- 当我们希望对数值进行统一管理时
預先設定的常數
在PHP中有两种类型的常量,分别是自动定义的常量和魔术常量。
自动定义的常量
代表性的东西
魔法常数
魔法常数是指根据使用场所自动变化的预定义常数。
代表性的东西
PHP: 类型
为什么会出现分类?
在计算机中,数据以1或0(开或关)的形式表示。它类似于灯泡开启或关闭的形象。由于仅凭这个无法区分数据的类型,因此为了区分数据的”是什么类型的值”,”类型”的概念应运而生。
二进制
计算机以自然数(0〜9)作为基础来处理数据。
当考虑如何用灯光的开和关来表示这些自然数时,二进制是最优和最高效的表示方法。
因此,计算机内部使用二进制来处理数据。
“类型”用于指示二进制数值的具体种类。
模型的发展
随后,这种类型便开始发展成为多种用途的形式。
-
- 仕様としての型で安全性を高めるようになった
-
- 関数の引数や戻り値に型を明示することで、プログラムの安全性を高める
-
- 動的型付けも登場した
- 型を明示しない動的型付けも誕生した。PHPは動的型付けにより型を自動で判断する。
PHP的数据类型:①整数
整数可以分为正整数、零和负整数。
echo gettype(1); // integer
echo gettype(0); // integer
echo gettype(-1); // integer
可以表示二进制数、八进制数和十六进制数。
var_dump(0b10); // int(2) 2進数
var_dump(010); // int(8) 8進数
var_dump(0x10); // int(16) 16進数
整数有一个最大值,当超过最大值时会被转换为浮点数类型(float)。
var_dump(PHP_INT_MAX); // int(9223372036854775807)
var_dump(PHP_INT_MAX + 1); // float(9.223372036854776E+18)
PHP的数据类型:浮点数
浮点数是指不能用整数来表示的实数,比如小数或分数。
- 初期化には2種類の方法がある
$float1 = 1.1;
$float2 = 1.1e2; // 指数表記。1.1*10の2乗
var_dump($float1); // float(1.1)
var_dump($float2); // float(110)
处理浮点数的方法
浮点数具有精度限制,因此在处理时需要注意。
小数可能会发生舍入误差的可能性。
-
- 小数点を使った比較、計算をしないようにする
- 浮動小数点で比較や計算を行うときは任意精度数学関数(BC Math関数)を使う
PHP的数据类型:③字符串
文字列的特点
文字列是由多个字符连接而成的东西。
初期化はシングルクォートもしくはダブルクォートを使う
シングルクォートは変数を展開しない
ダブルクォートは変数を展開する
シングルクォートの方が動作処理速度は速い
文字列と変数の結合にはドット記号を使うこともできる
$var = 1;
echo '$var years old'; // $var years old
echo "$var years old"; // 1 years old
echo "${var}years old"; // 1years old
echo $var . 'years old'; // 1years old
转义处理
要将单引号和双引号作为字符处理,需要进行转义。
echo 'I\'m "Jun 2035"' . PHP_EOL; //I'm "Jun 2035"
Here is one option for paraphrasing “ヒアドキュメントとNowdoc” in Chinese:
“Here-doc和Now-doc”
有两种方法可以用来写入多行的长字符串,分别是“heredoc”和“nowdoc”。
- ヒアドキュメントはダブルクォートで囲んだ文字列として扱う(変数展開される)
$name = 'Jun2035';
$str = <<<EOT
こんにちは。
名前は $name です。
EOT; // 名前は Jun2035 です。
- Nowdocはシングルクォートで囲んだ文字列として扱う(変数展開されない)
$name = 'Jun2035';
$str = <<<'EOT'
こんにちは。
名前は $name です。
EOT; // 名前は $name です。
转义序列
转义序列是用来表示在程序中难以处理的字符的一种方式。
- 以下はダブルクォートで囲まれた場合、特殊な文字として解釈される
- 改行コードを実行環境で切り替えたいときはPHP_EOLを使う
请注意半角字符串和全角字符串的区别。
- 全角文字はマルチバイトとしてカウントされるので注意
$str1 = 'abc';
$str2 = 'あいう';
echo strlen($str1); // 3
echo strlen($str2); // 9
echo mb_strlen($str2); // 3
- 半角と全角のゆらぎは統一すべし
$name1 = 'ムラカミハルキ'; // 半角
# 半角カタカナは全角カタカナに、全角スペースは半角スペースに、
# 全角英数字は半角英数字に変換する
echo mb_convert_kana($name, 'Kas'); // ムラカミ ハルキ
PHP: 运算符
追加计划
PHP: 控制结构
添加预定
PHP: 调试方法
加上备注计划
面向对象:概念。
追加计划
面向对象:类
附加备注计划
面向对象:接口
追加计划
面向对象编程:命名空间
待补充的内容
面向对象:异常处理
添加计划