ホームページ >バックエンド開発 >PHPチュートリアル >PHP の基礎: PHP プログラミングの概要
私たちの業界が非常に難しい業界であることは否定できません。第二言語の学習を考えたことはありますか?さて、5つではどうでしょうか?最新の Web 開発者になりたい場合は、これが必要なものです。このことを念頭に置いて、注意しないと、無数のわかりにくいブログ投稿や技術書を盲目的に見つめることになり、すぐに圧倒されてしまう可能性があります。
何事でもそうですが、重要なのは一度に一歩ずつ進めることです。
何事でもそうですが、重要なのは一度に一歩ずつ進むことです。 1か月で英語を話せるようにならなかった自分を責めますか?もちろん違います。次に、同じレベルの考え方をプログラミングの取り組みに適用します。これらには時間がかかりますが、前進し続ける限り、すぐに目的地に到達します。止まらないで!
最初のステップは HTML です。 dc6dce4a544fdca2df29d5ac0ea9906b
が何をするのかを学びましょう。セマンティック タグを使用してコンテンツを構築する方法を学びます。スタイルのない基本的な Web ページを作成します。
ご想像のとおり、2 番目のステップは CSS です。ページ上の要素のスタイルを設定する方法を学びます。 「関心事の分離」の意味と、それが HTML と CSS にどのように適用されるかを学びます。最初のシンプルな Web サイトを完成させます。
3 番目のステップは、開発者が自分の専門分野への分岐を開始することです。この時点で、かつてないほど急成長を遂げている JavaScript の世界に飛び込むことができます。あるいは、バックエンドに集中して取り組むこともできます。
フロントエンドとバックエンドの違いについて混乱していますか?フロントエンドはタイタニック号の沈没につながった氷山の一角だと考えてください。これは、ユーザーに表示され、操作できるアプリケーションの部分です。一方、バックエンドは、永続化から検証、ルーティングまですべてを処理します。
この記事では、後者のオプション (サーバー側) を選択したものと仮定します。
PHP が Web を支配していることは否定できません。
残念ながら、またもや障害に遭遇してしまいました。最も人気のあるオプションである PHP を選択する必要がありますか?ルビーはどこですか?最近のクールな子供たちはそれを好むようです。では、ひげが生えていたらどうでしょうか? Python の選択は正しいでしょうか?しかし最も重要なことは、経験がゼロのときにどうやって選択を行うことができるでしょうか?
この場合、著者の意見では、間違った選択はありません。もちろん、方向転換を妨げるものは何もありません。実際、すべての開発者は複数の言語を学ぶことが推奨されています。ただし、今重要なのは、1 つだけを選択して、それをよく学ぶことです。
PHP は確かに最も美しい言語ではありませんが、Web を支配していることは否定できません。実際、これは世界で最も人気のあるスクリプト言語です。この利点は、すべての PHP の問題が提起され、解決され、文書化されていることを安心できることです。それを知ると安心します。あなたは学習の最も脆弱な段階にいますが、すぐそばに大規模でフレンドリーなコミュニティがあり、すぐに助けてくれます。さらに嬉しいことに、PHP は Composer や Laravel などのツールのおかげで、前例のないモダンなルネッサンスを経験しています。
PHP (PHP: Hypertext Preprocessor の略) (そう、開発者は再帰ジョークが大好きです) は、Web 専用に構築されたスクリプト言語です。ただし、これはまだあなたにとって何の意味もない可能性があります。スクリプト言語?ああ?単純な HTML ではなく PHP を選択するのはどのような場合ですか?まあ、一例かもしれません。 PHP が正常にインストールされていると仮定して、デスクトップ上の新しいフォルダーに index.php
ファイルを作成し、次の内容を追加します。
リーリー
はい、これはどこにでもある「このコードを実行するには、PHP の組み込みサーバーを使用します。お気に入りのコマンド ライン ツール (Mac ユーザーの場合はターミナル) に切り替え、hello world」の例で、スキルが上がれば慣れるほど馴染みます。すべての言語、フレームワーク、ツールに対応するものが 1 つあります。
cd でプロジェクト フォルダーに移動し、
php -S localhost:8888 を使用してサーバーを起動します。このコマンドは、「
サーバーを実行し、ローカルホスト、ポート 8888 上のブラウザーからアクセスできるようにする」と変換されます。ぜひ試してみてください! Google Chrome を開き、localhost:8888 を参照すると、ページに「Hello world*」と表示されます。かわいい!
echo は、指定された値を出力するだけの言語構造です。
ヒント: MAMP と WAMP は、コマンド ラインを手探りすることなく、Mac または PC に PHP、MySQL、Apache をワンクリックでインストールできる優れたソリューションです。これらは、学習の初期段階では役立つオプションとなる可能性があります。
诚然,这并不是世界上最令人兴奋的事情。事实上,您可能会想,“为什么我不能将“Hello world”直接写入 HTML 页面,从而完全不需要 PHP?”这是真的;对于这个例子来说,它没有任何作用。然而,当输出本质上是动态的时,像 PHP 这样的脚本语言就变得特别有用。如果您希望问候语引用通过 URL 的查询字符串(地址栏中问号后面的文本)传递的值,而不是 world,该怎么办?这是一个更新的示例,它就实现了这一点!
<?php echo 'Hello, ' . $_GET['person'];
啊,这引入了一些新技术。首先,分隔 Hello 字符串和令人困惑的 $_GET
的单个句点允许您连接(或分组)值。在本例中,我们希望打印“Hello, *”,然后打印 $_GET['person']
表示的值。这就是我们所说的超全局数组。为了简单起见,可以将其视为从 URL 的查询字符串*获取值的一种方法。
通过加载 localhost:8888/?person=Joe
来测试这一点。如果配置正确,网页现在应该显示“Hello, Joe”。通过将 Joe
替换为您自己的名称来尝试一下。请注意每次刷新页面时输出如何更新?这对于静态 HTML 来说根本不可能实现。
成熟编程的关键之一是考虑代码中每一个可能的路径。例如,如果没有 person
密钥可用怎么办?也许查询字符串被完全省略了。在这种情况下,肯定会抛出错误,因为 person
键不存在。解决办法是什么?虽然这确实只是一个简单的例子,但考虑所有可能的结果仍然很重要。让我们提供一个默认值。
<?php if (isset($_GET['person'])) { $person = $_GET['person']; } else { $person = 'Joe'; } echo 'Hello, ' . $person;
尽管有更简化的方法可以实现这一点,但上面的示例是一个很好的起点。这也是您对条件语句的第一次介绍。以与处理现实生活中的场景相同的方式处理代码。例如,“如果我们没有牛奶,就去商店。否则,就呆在家里。”这种思路可以使用以下逻辑转换为 PHP:
$outOfMilk = true; if ($outOfMilk) { echo 'Going out to the store.'; } else { echo 'Breakfast is served.' }
在这段代码中,只会将一行文本打印到屏幕上。变量值(动态值)$outOfMilk
将确定控制流。
提示:要在 PHP 中声明变量,请在任何名称前添加美元符号。作为最佳实践,选择可读的变量名称而不是神秘的替代名称。
回到前面的例子,只要设置了 $_GET['person']
(可以将其视为“可用”的伪名),然后创建一个新的 $person
变量 equal到它的价值。否则,应用默认值。如果您返回到浏览器,它现在应该可以正常运行,无论查询字符串中是否存在 person
键。
不幸的是,我们仍然没有回家。一个关键的编程最佳实践是将安全性置于每项操作的最前沿。即使有了这个令人难以置信的基本示例,我们也为网络上最普遍的安全问题之一打开了大门:XSS(跨站脚本)。对此的真正理解绝对超出了本入门课程的范围(整本书都写过它),但是,这里有一个基本说明:如果 $_GET['person']
等于而不是字符串怎么办,但是一个脚本?
http://localhost:8888/?person=<script>alert('ATTACK!')</script>
由于该值尚未被清理,因此在执行时,在某些浏览器中会显示警告框。
基于 Webkit 的浏览器(例如 Chrome 和 Safari)现在可以提供针对此类攻击的保护。然而,情况并非总是如此,并且在 Firefox 和 Internet Explorer 中仍然如此。
哎呀!我们不能这样。虽然现代社会表明一个人在被证明有罪之前是无辜的,但对于编程世界来说却并非如此。所有用户输入在经过净化之前都是有罪的!这是一个更新的示例,它执行此操作:
<?php if (isset($_GET['person'])) { $person = $_GET['person']; } else { $person = 'Joe'; } echo 'Hello, ' . htmlspecialchars($person, ENT_QUOTES);
通过此修改,如果有人尝试 XSS 攻击,我们将做好准备! htmlspecialchars
是一个本机 PHP 函数,可将各种符号转换为其实体对应部分。 &
变为 &
、 变为 <code> 等。这使其成为提供额外安全性的完美工具。 <code><script></script>
如果在执行前转换为 <script></script>
则没有任何意义。用户将简单地看到:
Hello, &lt;script&gt;alert('ATTACK!')&lt;/script&gt;
太棒了;没有造成任何伤害!
虽然 PHP 附带了大量本机函数,但有时您肯定需要自己的函数。幸运的是,编写它们很容易。
将函数视为可重用的逻辑片段,可以将其抽象出来,以便可以使用可读的名称来识别和调用它。
也许您经营一家夜总会(如果您正在阅读本文,则不太可能!),并且需要一种简单的方法来接受一个人的出生日期,并计算他或她是否至少有 21 岁。自定义函数将是完成此任务的绝佳方法。
第一步是定义一个新函数,名为 isAdult
。函数可以接受外部输入,然后可以对其进行操作。这允许函数返回的数据是动态的。在这种情况下,要确定一个人是否是成年人,我们需要知道他们的出生年份。最后一步是返回 true
或 false
,具体取决于当前年份减去该人的出生日期是否至少为二十一。
function isAdult($yob) { $currentYear = 2013; return $currentYear - $yob &gt;= 21; }
其实很简单!现在,我们只需要将其传递给保镖即可。可以通过引用其名称并后跟一组括号来触发或调用函数:isAdult()
。但是,如果函数需要参数,那么您可以在这些括号内指定它,如下所示:
if (isAdult(1985)) { echo 'Come on in!'; } else { echo 'Please leave now, before I call your mother.'; }
这个 isAdult
函数有一个明显的问题。当前年份已被硬编码。当然,它会在整个 2013 年有效,但明年呢?看来这个值也需要是动态的。 PHP提供了一个date
函数,可以用来计算当前年份。因此,该功能可能会更新为:
function isAdult($yob) { $currentYear = date('Y'); return $currentYear - $yob &gt;= 21; }
几个月过去了,现在夜总会的生意比以往任何时候都好。事实上,它做得太好了,以至于保镖无法跟上。如果他可以一次筛选一组人,他的工作可能会更容易。
将数组视为相关数据的容器。您甚至可以将其称为列表:推文列表、一组家庭成员、一组出生日期。
最新版本的 PHP (5.4) 中的数组可以使用括号内的逗号分隔列表来定义,如下所示:
$group = [1985, 1990, 1992, 1997];
这个单个 $group
变量现在包含多个出生日期。可以通过指定索引来访问其中的值,例如 $group[0]
。数组就是我们所说的从零开始的数组。在翻译中,这意味着数组中的第一项或键的索引为零。因此,要访问 1992 年的值,您可以引用 $group[2]
。
现在,保镖可以快速过滤这些出生日期,并计算是否允许该人进入或拒绝他们。 foreach
语句可用于此类过滤。
$group = [1985, 1990, 1992, 1997]; foreach($group as $yob) { if (isAdult($yob)) { echo 'Come on in!'; } else { echo 'Please leave now, before I call your mother.'; } }
注意保镖如何声明 group
中的出生年份 foreach
人应包含在变量 $yob
中。接下来,正如他之前所做的那样,他将该值传递给 isAdult
函数,并相应地继续。
不过,当保镖无法确定此人的出生年份和姓名之间的联系时,他可能会感到困惑。 PHP 还允许关联数组,它提供了将给定值与键关联起来所需的功能。这是一个例子:
$group = [ 'John' =&gt; 1985, 'Susan' =&gt; 1990, 'Joe' =&gt; 1992, 'Sara' =&gt; 1997 ];
这样更好。作为额外的好处,保镖现在知道了这个人的名字,可以对这个人更加友好一点。
$group = [ 'John' =&gt; 1985, 'Susan' =&gt; 1990, 'Joe' =&gt; 1992, 'Sara' =&gt; 1997 ]; foreach($group as $name => $yob) { if (isAdult($yob)) { echo "Come on in, $name!"; } else { echo "Please leave now, $name, before I call your mother."; } }
在双引号内存储字符串时,您可以嵌套变量而不是使用连接。这可以提供更具可读性的语法。
面向对象的编程远远超出了本教程的范围,但是,类仍然值得一提。现在,将它们视为相关属性和方法的简单容器。例如,代表单个人的类可能如下所示:
class Person { public $name; public $age; public function __construct($name, $age) { $this-&gt;name = $name; $this-&gt;age = $age; } }
注意到 __construct()
方法了吗?这被称为魔术方法,实例化后会立即触发。当此方法触发时,它将接受名称和年龄,然后将其附加到对象。
要使用此类,请尝试:
$me = new Person('Jeffrey', 28);
这将创建 Person
类的新实例。该实例存储在 $me
变量中,可以称为对象。现在,没有什么可以阻止您创建此类的多个实例 - 事实上,在现实世界的项目中,您会这样做!该类只是一个蓝图。
但此时,该类还没有太大用处。让我们添加一个方法或函数来指定一个人的配偶。
class Person { public $name; public $age; public $spouse; public function __construct($name, $age) { $this-&gt;name = $name; $this-&gt;age = $age; } public function marry(Person $spouse) { $this-&gt;spouse = $spouse; } } $me = new Person('Jeff', 28); $her = new Person('Allison', 28); $me-&gt;marry($her);
此修改后的代码现在包含一个 marry()
方法,该方法将更新对象上的 $spouse
属性。现在,两个人之间有了直接联系。
如果方法参数前面有一个类名(
Person $spouse
),称为类型提示,则表明该参数必须是给定类的实例,否则将引发错误。 p>
要获取我配偶的名字,您可以这样写:
echo $me-&gt;spouse-&gt;name; // Allison
面向对象编程的概念比这更深入,但现在保持简单。它有助于将类视为单数名词:推文、用户、客户或文件。
对这种模式的真正欣赏只会随着时间的推移而出现。
测试您新发现的技能。您如何在页面上为用户注册和显示推文?好吧,第一步可能是定义一个代表单个 Tweet
的类。此类应存储推文正文的属性及其发布日期。此外,还应确保推文正文不超过 140 个字符。这是此类课程的第一次尝试:
class Tweet { public $body; public $pubDate; public function __construct($body) { $this-&gt;setBody($body); $this-&gt;setPubDate(new DateTime); } public function setBody($body) { if (strlen($body) &gt; 140) { throw new InvalidArgumentException; } $this-&gt;body = $body; } public function setPubDate(DateTime $date) { $this-&gt;pubDate = $date-&gt;format('Y/m/d H:i:s'); } }
虽然一开始看起来可能令人不知所措,但请稍微研究一下这段代码,并尝试了解每一步发生的情况。您可能会发现它非常可读!
一个有趣的新功能源于 setBody
方法。如果提供的文本超过 140 个字符(我们可以使用 PHP 的 strlen
函数计算),那么我们应该对此表示反对,因为它违反了推文的规则。可以使用语法 throw new ExceptionType
抛出异常。
现在我们有了一个足够合适的推文容器,我们可以创建几条推文,将它们存储在一个数组中,然后最终使用 foreach
语句将它们呈现在页面上。
$tweets = []; # add two new tweets to the array $tweets[] = new Tweet('Going to the store.'); $tweets[] = new Tweet('Back from the store!'); # Filter through, and display on page. foreach($tweets as $tweet) { echo &quot;&lt;h2&gt;{$tweet-&gt;body}&lt;/h2&gt;&quot;; echo &quot;&lt;p&gt;Posted on: {$tweet-&gt;pubDate}&lt;/p&gt;&quot;; }
在浏览器中查看输出后,您应该看到类似以下内容的内容:
很好,但是我们如何保存这些推文?
到目前为止,您已经学习了基础知识:变量、条件、函数、数组、类。还有更多内容需要介绍,但您应该根据需要自行研究。学习的下一步就是坚持。例如,您如何保留所有推文的日志?不记住推文的推文服务是一个糟糕的服务!这就是数据库的想法发挥作用的时候。
将数据库表视为 Excel 电子表格。它可以包含任意数量的字段,例如人员的姓名、年龄或邮寄地址。然而,PHP 本身并不提供这种存储。相反,最常见的选择是 MySQL,它是世界上最流行的开源数据库。
安装 MySQL 不属于本教程的范围。相反,请参阅 Nettuts+ 上的本教程以获取完整的演练。
下面是一个简化的示例,可帮助您开始从数据库表中安全地获取行。如果它看起来势不可挡,请不要担心。 MySQL 是您要学习的第二门新语言。 PHP 的 PDO API 以及查询语言本身需要时间学习。
首先,您需要一种连接数据库的方法。
function connect() { $conn = new PDO( 'mysql:host=localhost;dbname=DB_NAME', 'USERNAME', 'PASSWORD' ); $conn-&gt;setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); return $conn; }
PDO 是 PHP 用于连接 MySQL 数据库的三个可用 API 之一。
接下来,我们将添加一个辅助函数来从 tweets 表中获取所有记录。请密切注意 query
方法的参数 SELECT * FROM tweets
。这是一种用于查询数据库的特殊语言。在本例中,我们使用 *
符号来引用所有行。因此,我们从表中选择所有行,名为 tweets
。
此函数准备查询,然后获取完整的结果集。
function fetchTweets($conn) { $stmt = $conn-&gt;query('SELECT * FROM tweets'); return $stmt-&gt;fetchAll(PDO::FETCH_OBJ); }
现在,阶段设置完毕,我们只需要相应地调用函数即可。
# Connect to the DB $conn = connect(); # Fetch all rows from attendees table var_dump(fetchTweets($conn));
转储变量内容的一个简单方法是使用 var_dump
函数。如果将 fetchTweets($conn)
的输出传递给此函数,在浏览器中查看它时,您将看到类似以下内容的内容:
var_dump
对于调试很有帮助,但出于生产目的,最好过滤结果,并将它们正确呈现在页面上。您已经熟悉的 foreach
语句将很好地处理这项工作!
$tweets = fetchTweets($conn); foreach($tweets as $tweet) { echo &quot;&lt;h2&gt;{$tweet-&gt;body}&lt;/h2&gt;&quot;; echo &quot;&lt;p&gt;{$tweet-&gt;pubDate}&lt;/p&gt;&quot;; }
与任何技能一样,编写流利的 PHP 只需要您的时间。可能需要数百个小时才能完全理解,但这没关系。这很有趣,对吧?应该是这样!
最好的学习方法就是实践。构建废弃的项目,就像它们已经过时一样!本教程中概述的技术将带您完成第一阶段,但是,随着您技能的进步,您肯定会继续学习更高级的主题,例如 PHP 框架、设计模式和测试驱动开发。玩得开心!
以上がPHP の基礎: PHP プログラミングの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。