PHP的语句和表达式

这个幻灯片是为了在突发举办的PHPerKaigi Online(仮)上演讲而准备的。


上次的概要


PHPカンファレンス関西2020 【公募セッション募集について】 今年も例年どおりPHPカンファレンス関西では公募セッション枠として、有志PHPerの皆様からセッションのスピーカーを募集します。 ※LTのスピーカー募集については後日発表予定です。


PHP语法入门,以自如地操作代码为目标。

是否曾经想要准确检查和修改PHP源代码的部分呢?PHP有一个叫做PHP-Parser的语法解析库,静态分析工具PHPStan和重构工具Rector都是基于PHP-Parser的插件,可以用来检查和修改源代码。

然而,操作语法树需要对编程语言有比平常编写PHP代码更多的了解。在这个演讲中,我们将介绍与处理语法树相关的编程语言知识,PHP-Parser的结构,以及PHPStan和Rector的扩展方法和实例。


誠に残念ではございますが、新型コロナウイルスの感染拡大を鑑み、PHPカンファレンス関西2020の開催を断念することになりました。楽しみにして頂いた皆様に心よりお詫び申し上げます。公式サイトの告知は追って更新します。


请将以下内容以中文进行释义:”The rapid development of technology has brought about significant changes in our daily lives. It has revolutionized the way we communicate, work, and access information. With the invention of smartphones and social media platforms, we can now easily connect with people from all over the world and stay updated with the latest news and trends. Additionally, technology has made tasks more efficient and convenient. From online shopping to remote working, we can accomplish various activities with just a few clicks. Overall, technology has become an integral part of our lives, enhancing our productivity and connecting us like never before.”


重新抓住气息


我上周写了这样的文章。

Qiita echoとprintの違い


回声(echo)和打印(print)之间的区别可以概括如下。

    • 関数マニュアルに載っているが関数ではない

echoとprintは出力バッファに書き込む

echoは文だがprintは式(式文)

echoは複数の引数、printは1つの引数


echo是一种语句,而print是一种表达式(表达式语句)。


因此,本次我们将重点讨论文本和公式。


请回答问题。


哪个选项不会导致语法错误呢?

echo print 1;
print echo 1;

学习编程语言时,首先学习这样的事情。


對於初學者而言,被灌輸的神秘術語if文で条件分岐をします

for文で繰り返します
代入文で変数に値を入れます

return文で関数から値を返します


大多数的人在弄明白它是什么之前就会掌握如何使用,所以不会遇到任何困扰。


在PHP中有各种语句和表达式。


关键词列表

PHPマニュアルに載っているPHPのキーワード(予約語)のリスト


这个列表混杂地列着文本和公式。


让我们分解程序的构成要素。


对于PHP来说

<?php

function sum(array $values)
{
    $sum = 0;

    foreach ($values as $v) {
        $sum += $v;
    }

    return $sum;
}

随着时间的推移逐渐赋予意义

<?php // ← PHP開始タグ

function sum(array $values) // ← 関数定義
{
    $sum = 0; // 変数代入

    foreach ($values as $v) { // foreach
        $sum += $v; // 変数代入
    }

    return $sum; // 戻り値
}

将文章和表达区分开来

<?php // ← PHP開始タグ(特殊)

function sum(array $values) // ← 関数定義「文」
{
    $sum = 0; // 変数代入「式」

    foreach ($values as $v) { // foreach「文」
        $sum += $v; // 変数代入「式」
    }

    return $sum; // 戻り値「文」
}

PHP有一些受到写作限制的元素的位置有限。


在PHP中,无法编写这样的代码。

<?php

const A = hoge();

function a($a = foo())
{
    return $a;
}

在PHP中无法编写这样的代码当我们谈论一件事很正常时,我们在谈论什么呢?

foreach (function a(){return [];} a() as $b) {
    return $b;
}

“式(expression,expr)是什么?”的含义是什么?


这种样式可以写在这里。在這裡可以寫的是一個運算式。

ifの条件を書くところ if ($v == 1)

whileの条件を書くところ while (count($a) !== 0)

関数呼び出しの引数 foo($a + 1)

代入の右辺 $v = 30 * MINUTES

return に書けるもの return foo() + bar()

echo, print, に渡せるもの


经常使用的表达(第1个)

    • 関数・メソッド呼び出し printf() $obj->foo() $func()

演算子式

論理否定 !$foo

比較式 $a == $b $user instanceof User

算術演算 1 + 1

短絡論理演算子 $n <= 0 && $n < 24 foo() or bar()

インクリメント・デクリメント $i++ –$i


常用的表达方式(第二部分)

    • 無名関数式 function ($a) { return $a * 2; } fn($a) => $a * 2

無名クラス new class(‘foo’){ function __construct($name) { $this->name = $name; } }

配列リテラル [$a, $b, ‘foo’ => foo()]

三項演算子 $foo == ‘bar’ ? ‘A’ : ‘B’


常用的表达方式(第三个)() 式のグルーピング

isset, empty

eval

assert

PHP5では関数だったがPHP7で言語構造になった

exit die

変数・スカラーリテラル・定数・マジカル定数

$a 1 “a” true HOGE


样式的特点

    式の中に再帰的に式を書ける

这个也是活动的一种方式。

    • $a = include __DIR__ . ‘/config.php’

 

    • $b = eval(‘return 1 + 1;’)

 

    • $c = yield 1;

 

    • $d == 1 or die()

 

    $e = foo() and print $e

非常糟糕的是,根据类型的不同,括号是否可省略是不一致的,必须单独记忆它们(或在编辑时进行语法检查)。


这个公式可以在这种情况下写出来foreach の as の左側
foreach (foo() as $f)

include, requireの引数
式の中には任意の組み合せの式が書ける

ただし [] + 1 のような式はPHP7ではパーサーレベルで怒られるようになった


请使用中文对下列内容进行释义,只需提供一个选项:文


常用的句子

    • 関数/メソッド定義文 function

 

    • クラス定義文 class interface use

制御構文 while for do foreach

出力文 echo 静的変数 static $var

グローバル変数 global $var


文章分类


The characteristics of the passage

    • 式は任意の式を組み合わせられる

 

    • 文は文ごとに決まったルールがある

式を書けるもの
式と文を書けるもの
それ以外の記述ができるもの


表达语句 (expression statement)

<?php
require_once ___DIR__ . '/foo.php'; // require式だけの文
$n = 100; // 代入式だけの文
printf("%f", 1.1); // 関数呼び出しだけの文
assert($n < 100); // assert式だけの文
print 1; // print式だけの文

表达陈述

    • 全ての式は ;または?> で区切ることで文になる。

 

    • 式を式文(expression statement)と呼ぶ。

ただし、;がつくからと言って式文とは限らない。

この記事のコード注釈で「式」と書いた場合は、その式を内包する文である


复句可以编写多个句子。通常与if和foreach组合使用。

{
    foo();
    bar();
}

如果条件成立,执行操作A,否则执行操作B。如果条件1成立,执行操作A,否则如果条件2成立,执行操作C,否则执行操作B。如果条件1成立,执行操作A,否则如果条件2成立,执行操作C,否则如果条件3成立,执行操作D,否则执行操作B。在这个句子中,虽然可以只写一个句子,但通常不倾向于不使用 {},而是倾向于使用复句并换行编写,例如 if ($cond) echo 1; 这样的写法不受欢迎,而 if (true) { echo 1; } 这样的写法受到青睐。

if () 
if ()  else  
if ()  elseif () 
if ()  elseif ()   else  

请用中文改述以下内容,只需给出一种选项:
不要用另一种句法表达方式。

if ():  endif;
if ():  else:  endif;
if ():  elseif: ()  endif;
if ():  elseif: ()   else  endif;

一边…一边…

while () 

请用别的句式表达

while ():  endwhile;

复杂的重复操作

for (最初に実行される式; 継続判定式; 繰り返しごとに実行される式) 

不要用其他方式表達

for (最初に実行される式; 継続判定式; 繰り返しごとに実行される式):  endfor;

文与非文混杂的复杂案例新手杀手

// これは関数定義文なので最後に ; は要らない
function f() { ... }

// これは変数代入式なので最後に ; が必要
$f = function() { ... };

代入式和代入句的复杂案例

// これは代入式
$a = 1;

// これはstatic変数の宣言文
static $b = 1;

可以写特别的文

    • 静的に解決できる式だけ書ける (PHP 7)

const
プロパティ

const SEC = 1;
const MINUTES = 60 * SEC;
const HOUR = 60 * MINUTES;

题目答案


echo print 1; // echo は文なので式(print)を引数にとれる
print echo 1; // echo は文なので式(print)の引数に書けない

bannerAds