この記事は、2018 年の PHP 面接の質問の最新の概要 (回答付き) をまとめたものです。一定の参考価値があります。困っている友人は参考にしてください。お役に立てれば幸いです。
関連おすすめ: 「2019年PHP面接質問まとめ(集)」
1. PHP頻出試験の基礎
#1. PHP、ASP、JSP の違いは何ですか?
ASP の正式名は Active Server Pages です。これは、Windows プラットフォームに基づく Web サーバー側の開発環境です。動的で対話型の高パフォーマンスの Web サービスを生成および実行するために使用できます。 Microsoft プラットフォームでのみ使用できますが、移植性は良くありません。 ASPは独自の開発言語としてスクリプト言語VB ScriptとJScript(JavaScript)を使用します。初期の国内 Web サイトのほとんどは、これを使用して開発されました。ただし、Microsoft の全体的な移行により、ASP.NET は ASP Web 開発モデルを放棄したため、現在は廃止されています。PHP は、クロスプラットフォームのサーバーサイド組み込みスクリプト言語です。 C、Java、Perl 言語から多くの構文を借用し、PHP 独自の機能を組み合わせて、Web 開発者が動的に生成されるページをすばやく作成できるようにします。 HTML に埋め込むことができるため、Web 開発に非常に適しており、最新のデータベースをサポートしています。また、PHP は完全に無料であり、開発者はお金をかけずに PHP 公式サイト (http://www.php.net) から自由にダウンロードできます。また、開発者はソースコードを無制限に入手でき、必要な機能を追加することもできるため、高い開発効率と低コストを実現します。
JSP は Sun が開発したネットワーク プログラミング言語で、クロスプラットフォームで動作し、高いセキュリティと高い操作効率を備えています。開発言語は主にJavaに基づいています。
ASP、JSP、および PHP はすべて、HTML コードに何らかのプログラム コードを混合し、それを解釈して言語エンジンで実行する機能を提供します。ただし、JSP コードはサーブレットにコンパイルされ、Java 仮想マシンによって解釈および実行されます。このコンパイル操作は、JSP ページが初めてリクエストされたときに発生する場合にのみ使用されます。 ASP、PHP、および JSP 環境では、HTML コードは主に情報の表示スタイルを記述し、プログラム コードは処理ロジックを記述するために使用されます。通常の HTML ページは Web サーバーのみに依存しますが、ASP、PHP、および JSP ページでは、プログラム コードを分析して実行するために追加の言語エンジンが必要です。プログラムコードの実行結果はHTMLコードに再埋め込まれ、ブラウザにまとめて送信されます。 ASP、PHP、および JSP はすべて Web サーバー指向のテクノロジであり、クライアント ブラウザには追加のソフトウェア サポートは必要ありません。
2. PHP では、一重引用符で囲まれた文字列と二重引用符で囲まれた文字列の違いは ( ) です。
#A.一重引用符は rt などのエスケープ文字を解析しますが、二重引用符は
C.一重引用符は高速ですが、二重引用符は低速です
D。二重引用符は $ で始まる変数を解析しますが、一重引用符は解析しません
参考回答: D.
分析: 二重引用符は変数を解析し、$ 記号で始まる文字をエスケープできますが、一重引用符は文字を解析またはエスケープしません。したがって、選択肢 A は誤りであり、選択肢 D が正しいです。
オプション B と C では、質問に引用符に文字列が含まれることが明確に示されているため、変数を解析する必要はありません。この場合、二重引用符と一重引用符の効率は同じです。選択肢 B と C は両方とも正しくありません。
オブジェクト指向は、今日のソフトウェア開発手法の主流の手法の 1 つであり、データとデータ上の操作を相互に依存する全体、つまりオブジェクトとしてまとめます。類似したオブジェクト、つまりクラスの共通の機能を抽象化します。クラス内のデータのほとんどは、このクラスのメソッドでのみ処理できます。このクラスは単純な外部インターフェイスを通じて外の世界に関係し、オブジェクトはメッセージを通じて通信します。プログラムの流れは使用時にユーザーが決定します。例えば、抽象的な観点から見ると、人間には身長、体重、年齢、血液型などの特別な名前があり、人間は働き、直立して歩き、食事をし、自分の頭を使って道具を作ることができます。存在しない存在ではあるが、人間集団の属性や方法を持ったすべての物体を人と呼び、この対象者は現実に存在する存在であり、誰もが人間集団の対象である。
プロセス指向とは、イベント中心の開発手法であり、上から下へ順番に実行され、徐々に洗練されていくもので、プログラム構造は機能ごとにいくつかの基本モジュールに分割され、これらのモジュールがツリー構造を形成しています。モジュールは比較的単純で、機能的にも比較的独立しています 各モジュールは一般にシーケンス、選択、ループの 3 つの基本構造で構成されます モジュール化の具体的な実装方法はサブルーチンを使用することであり、プログラムの流れはプログラムを書くときに決定されますたとえば、バックギャモンのプロセス指向の設計思想は、まず問題のステップを分析することです: 第 1 ステップ、ゲームの開始、第 2 ステップ、黒い石が最初に動きます、第 3 ステップ、絵を描きます、第 4 ステップ、ステップ 勝敗を判断する; ステップ 5、白の番です; ステップ 6、絵を描く; ステップ 7、勝敗を決定する; ステップ 8、ステップ 2 に戻る; ステップ 9、最終結果を出力します。上記の各ステップを個別の機能で実装するのが、プロセス指向の開発手法です。
具体的には、両者は主に次の点で異なります。 ###1)出発点が違います。オブジェクト指向とは、従来の思考方法を使用して客観的な世界の問題に対処することであり、問題領域のキーポイントをオブジェクトおよびオブジェクト間のインターフェイスに直接マッピングすることを強調します。プロセス指向の場合はそうではなく、プロセスの抽象化とモジュール化を重視し、プロセスを中心として客観的な世界の問題を構築したり処理したりします。
2) 階層的な論理関係が異なります。オブジェクト指向手法は、コンピュータロジックを使用して客観世界における物理的存在をシミュレートし、問題を処理するための基本単位としてオブジェクトのコレクションクラスを使用し、コンピュータ世界を可能な限り客観世界に近づけます。オブジェクト メソッドは、クラスの階層構造を使用して、クラス間の継承と発展を反映します。プロセス指向の問題処理手法の基本単位は、プロセスを明確かつ正確に表現できるモジュールであり、モジュールの階層構造は、モジュール間の関係や機能、および対象世界の問題を要約するために使用されます。コンピュータで処理できるプロセスに抽象化されます。 ###3)データ処理方式と制御プログラム方式が異なります。オブジェクト指向方式では、データとそれに対応するコードを全体としてカプセル化し、原則として他のオブジェクトがそのデータを直接変更することはできず、オブジェクトの変更はそのオブジェクト自身のメンバ関数によってのみ完了します。 「イベント駆動型」プログラムを実行してアクティブ化します。プロセス指向方式では、プログラムを通じてデータを直接処理し、処理が完了した後に処理結果を表示することができますが、制御プログラム方式では、プログラムが設計に従って呼び出されたり返されたりするため、自由にナビゲートすることができません。制御、制御、および各モジュール間の呼び出しが呼び出されます。
4) 解析設計とコーディング変換方法は異なります。オブジェクト指向手法は、ソフトウェアのライフサイクル全体にわたって分析、設計、コーディングまでをスムーズに行うプロセスであり、分析から設計、コーディングまで一貫したモデル表現が使用され、シームレスな接続が実現されます。プロセス指向の手法では、ルールに従った分析、設計、コーディング間の変換を重視し、ソフトウェアのライフサイクル全体を通じて分析、設計、コーディング間のシームレスな接続を実現します。
A.
B.
C.
D.
参考回答: B.
分析: クラスを定義するには、class キーワードとクラス名を使用して定義します。定義形式は、class クラス名 {} です。クラスをインスタンス化する形式は $object=new classname(); です。
【本当の質問11】インスタンス化されたオブジェクトが属するクラスの名前を取得する関数は( )です。
A. get_class() B. get_object_vars()
C. get_class_methods() D. get_classname()
参考回答: A.
分析: オプション A では、get_class() 関数を使用してオブジェクトのクラスの名前を返します。したがって、選択肢 A が正しいです。
オプション B では、get_object_vars() 関数を使用して、指定されたオブジェクトの属性を取得します。したがって、選択肢Bは間違いです。
オプション C では、get_class_methods() 関数を使用してクラス メソッドの名前を取得します。したがって、選択肢 C は誤りです。
オプション D の場合、PHP にはそのようなメソッドはありません。したがって、選択肢 D は誤りです。
5. PHP オブジェクト指向に関する次の記述のうち、誤っているものはどれですか ( )。
B が報告されます。クラス名には、PHP の予約語ではない任意の有効なタグを使用できます。また、中国語の文字も PHP クラス名として使用できます
C。 PHP サブクラスでコンストラクターが定義されている場合、サブクラスのオブジェクトを作成するときに、その親クラスのコンストラクターは暗黙的に
D と呼ばれます。オブジェクトをシリアル化すると、オブジェクトのすべての変数が保存されますが、オブジェクトのメソッドは保存されません。クラスの名前のみが保存されます。
参考回答: C.
分析: サブクラスによって定義されたコンストラクターは、親クラスのコンストラクターをオーバーライドします。親クラスのコンストラクターだけでなくサブクラスのコンストラクターも実行したい場合は、明示的にparent::__construct( ); 電話をかける。したがって、選択肢 C は誤りです。
6. 以下の PHP 抽象クラスの説明で、間違っているのは ( ) です。 A. PHP の抽象クラスは、抽象キーワード
B を使用して定義されます。メソッド本体のないメソッドは抽象メソッドと呼ばれ、その抽象メソッドを含むクラスは抽象クラス
Cでなければなりません。抽象クラスには抽象メソッドがなければなりません。そうでない場合、そのメソッドは抽象クラス
Dとは呼ばれません。抽象クラスはインスタンス化できません。つまり、オブジェクトを新たに作成することはできません。
参考回答: C.
分析: 抽象クラスは空のクラスにすることができます。これは、必ずしも抽象メソッドを持つ必要がないことを意味します。ただし、抽象メソッドは抽象クラス内にのみ存在できます。したがって、選択肢 C は誤りです。
7. ポリモーフィズムとは何ですか? ポリモーフィズムは、オブジェクト指向プログラミングでコードを再利用するための重要なメカニズムです。これは、同じ操作が異なるオブジェクトに適用されると、異なるセマンティクスが存在し、異なる結果が生じることを意味します。たとえば、同じ " " 演算では、3 4 は整数の加算に使用されますが、"3" "4" は文字列の連結を実装します。一般に、ポリモーフィズムを実装するには、上書きとオーバーロードの 2 つの方法があります。
8. include と require の違いは何ですか? require と include には同様の機能があります。require または include ステートメントを使用して、指定されたファイル内のすべてのコード/テキスト/マークをファイルにコピーします。通常、データ、ファイル、またはコードを共有する必要があるシナリオで使用されます。共有する必要があるコードまたはデータを別の PHP ファイルに置くことで、require を使用してそれを参照するか、使用する必要があるファイルに含めます。 require() と include() は実際の関数ではないため、require() と include() ステートメントは括弧を使わずにパラメーターを直接追加することもできます。
9. 次のコードの出力は ( ) です。
<?php define("x","5"); $x=x+10; echo x; ?>A.エラー B. 5C. 10D. 15
参考回答: B.
分析: PHP では、define 関数を使用して定数を定義します。定数の値は、設定後に変更することはできません。この問題では、x の値は常に 5 です。したがって、選択肢 B が正しいです。
10. 変数を参照するにはどうすればよいですか? 変数を参照するには、変数の前に & 記号を追加できます。変数の参照は、変数にエイリアスを与えることと同じです。同じ変数の内容には別の名前でアクセスするため、値を変更します1 つの変数の値が他の変数の値を変更すると、変数も変更されます。
[実際の質問 54] 次のコードがあります:
<?php $a="hello"; $b= &$a; unset($b); $b="world"; echo $a; ?>プログラムの実行結果は ( )
A です。こんにちは、Bです。ワールドC。ヌルD. unset
参照回答: A.
分析: このコードの実行プロセスを次の図に示します。
1)首先执行$b= &$a后,a和b引用同一个字符串变量“hello”。
2)接着执行unset($b),这个函数可以断开这个引用关系。此时由于a仍然指向字符串“hello”,也就是说,这个字符串仍然被a使用,因此这个字符串不会被回收。
3)接着执行$b="world",此时,b指向一个新的字符串“world”,这并不会影响a的值。因此输出结果为hello。
2、PHP常考进阶
11、请写一个函数验证电子邮件的格式是否正确。
参考答案:
function checkEmail($email) { $pregEmail= "/^([0-9A-Za-z\\-_\\.]+)@([0-9a-z]+\\.[a-z]{2,3}(\\.[a-z]{2})?)$/i"; return preg_match($pregEmail,$email); }
分析:首尾两个斜杠/是正则表达式的限定符,这是Perl正则的标准,而PHP与Perl有相同的正则的规范。两个斜杠之间表示的是正则内容,后面的i表示忽略大小写。
这个正则表达式表示的含义如下:
1)必须以([0-9A-Za-z\-_\.]+)开头,也就是说,邮件地址以多个字母、数组、“-”或“.”开头。
2)紧接着是字符“@”。
3)然后接着是多个字母或数字的字符串,接着是一个字符“.”,接着是两个或三个字母;然后接下来一部分可有可无的:一个“.”后面跟着两个字母。
4)邮件的结束符是满足3)的字符串。
12、以下可以匹配中国居民身份证号码的正则表达式是( )。
A.d{15} B.d{18}
C.d D.(^d{15}$)|(^\d{18}$)|(^d{17}(d|X|x)$)
参考答案:D。
分析:d表示0~9任意数字。
13、【真题96】 一个函数的参数不能是对变量的引用,除非在php.ini中把( )设为on。
参考答案:allow_call_time_pass_reference。
分析:在PHP函数调用的时候,基本数据类型默认会使用值传递,而不是引用传递。allow_call_time_pass_reference 选项的作用为是否启用在函数调用时强制参数被按照引用传递。如果把allow_call_time_pass_reference 配置为on,那么在函数调用的时候会默认使用引用传值。但是不推荐使用这种方法,原因是该方法在未来的版本中很可能不再支持。如果想使用引用传递,那么推荐在函数调用的时候显式地使用&进行引用传递。
14、文件读操作
读取文件前,通常会判断文件能否读取,例如,是否有读权限,可以使用is_readable函数;示例代码如下:
<?php $file = "test.txt"; if(is_readable($file) == false) { echo "can not read\n"; } else{ echo "can read \n"; } ?>
当然也需要判断文件是否存在,可以使用file_exists()函数。示例代码如下:
<?php $file = "test.txt"; if(file_exists($file) == false) { echo "file not exist\n"; } else{ } echo "file is exists \n"; ?>
读取文件的方法有很多种,此处列举最常用的按行读取方法,示例代码如下:
<?php $file = "test.txt"; $fp = fopen($file,"r"); while(!feof($fp)){ echo fgets($fp,1024); } fclose($fp); ?>
需要注意的是,读取文件的length参数是可选项,如果忽略,则将继续从流中读取数据直到行结束。指定最大行的长度在利用资源上更为有效。此外,还有fread、file_get_contents等读取文件的方法,此处不再赘述。
15、什么是异常处理与错误处理?
当运行的程序发生异常被抛出时,程序不会继续执行异常处后面的代码,PHP 会尝试查找匹配的“catch”代码块。如果异常没有被捕获,那么将会发生严重的错误,程序会终止或者不受控制地执行。示例代码如下:
<?php function GetNum($num) { if($num > 10) { throw new Exception("Exception ocur"); } return true; } GetNum(100); ?>
程序的运行结果为
Uncaught exception 'Exception' with message 'Exception ocur'
从这个例子可以看出,如果不对异常进行处理,那么当程序有异常抛出的时候就会结束执行。而对于对象方法的异常处理,还有另外一种处理方法,下面介绍在PHP中当调用一些不存在的对象方法时的异常处理,从而保证程序正常运行。这主要是通过__call方法来实现的。
方法声明为__call($funname,$arr_value),当被调用方法不存在的时候会默认调用这个方法。
示例代码如下:
class My { function __call($n,$v) { echo "错误的方法名:".$n; echo "错误的参数:".$v; } }
16、什么是内存管理?
内存管理主要是指程序运行时对计算机内存资源的分配、使用和释放等技术,内存管理的目标是高效、快速地分配内存同时及时地释放和回收内存资源。内存管理主要包括是否有足够的内存供程序使用,从内存池中获取可用内存,使用后及时销毁并重新分配给其他程序使用。
在PHP开发过程中,如果遇到大数组等操作,那么可能会造成内存溢出等问题。一些常见的处理方法如下:
1)通过ini_set('memory_limit','64M')方法重置php可以使用的内存大小,一般在远程主机上是不能修改php.ini文件的,只能通过程序设置。注:在safe_mode(安全模式)下,ini_set会失效。
2)另一方面可以对数组进行分批处理,及时销毁无用的变量,尽量减少静态变量的使用,在需要数据重用时,可以考虑使用引用(&)。同时对于数据库、文件操作完要及时关闭,对象使用完要及时调用析构函数等。
3)及时使用unset()函数释放变量,使用时需要注意以下两点:
① unset()函数只能在变量值占用内存空间超过256字节时才会释放内存空间。
② 只有当指向该变量的所有变量都销毁后,才能成功释放内存。
17、与MySQL一样,Redis在使用过程中,也会碰到很多的问题,适当的技巧和优化将大大提高Redis的使用性能,提高服务的质量。现将常见的一些问题总结如下:
1.停止使用keys *操作
keys*操作执行速度将会变慢。因为keys命令的时间复杂度是O(n),其中n是要返回的keys的个数,由此可见这个命令的复杂度就取决于数据量的大小了。当数据量比较大时,在这个操作执行期间,其他任何命令在实例中都无法执行,严重影响了性能。
可以使用scan命令来代替,scan命令通过增量迭代的方式来扫描数据库。
2.定位Redis速度降低的原因
使用INFO commandstats命令来查看所有命令的统计情况,如命令执行了多少次,执行命令所耗费的毫秒数等信息。
18、Memcache的特征和特性
Memcache的特征如下:
1)协议简单。
2)基于libevent的事件处理。
3)内置内存存储方式。
4)Memcached不互相通信的分布式。
Memcache的特性如下:
(1)单个item 最大的数据为1MB。
(2)单进程最大的使用内存为2GB,需要更多内存时可开多个端口。
(3)Memcached是多线程,非阻塞io复用的网络模型,Redis是单线程。
(4)键长最大为250字节。
19、下面可以用于服务器共享session的方式有( )。
A.利用NFS共享Session数据 B.基于数据库的Session共享
C.基于Cookie的Session共享 D.使用类似BIG-IP的负载设备来实现资源共享
参考答案:A、B、C、D。
分析:共享Session的方式主要有以下几种:
1)基于NFS的Session共享。NFS(Network File System)最早由Sun公司为解决Unix网络主机间的目录共享而研发。仅需将共享目录服务器mount到其他服务器的本地session目录即可。
2)基于数据库的Session共享。
3)基于Cookie的Session共享。原理是将全站用户的Session信息加密、序列化后以Cookie的方式,统一种植在根域名下(如:.host.com),利用浏览器访问该根域名下的所有二级域名站点时,会传递与之域名对应的所有Cookie内容的特性,从而实现用户的Cookie化Session 在多服务间的共享访问。
4)基于缓存(Memcache)的Session共享。Memcache是一款基于Libevent多路异步I/O技术的内存共享系统,简单的key + value数据存储模式使得代码逻辑小巧高效,因此在并发处理能力上占据了绝对优势,目前能达到2000/s平均查询,并且服务器CPU消耗依然不到10%。
所以,本题的答案为A、B、C、D。
20. さまざまなセキュリティ問題を防ぐにはどうすればよいですか?
一般的なセキュリティ問題には主に次の側面が含まれます:
1) SQL インジェクション攻撃。いわゆる SQL インジェクション攻撃とは、攻撃者が Web フォームのフィールドまたはページ リクエストのクエリ文字列に SQL コマンドを挿入し、サーバーをだまして悪意のある SQL コマンドを実行させることを意味します。一部のフォームでは、ユーザーが入力した内容が動的 SQL コマンドの構築に直接使用されたり、ストアド プロシージャの入力パラメーターとして使用されたりすることがありますが、このようなフォームは SQL インジェクション攻撃に対して特に脆弱です。たとえば、Web サイト http://www.shuaiqi100.com/New... の場合、id はクエリ パラメーターであり、その ID を通じて特定の情報が表示されます。JSP プログラムでは、SQL ステートメントを使用して読み取ります。 the news: "select * from news where id =" id。正常に実行する場合は、id をパラメータ 2 に置き換えるだけで問題ありません。ただし、不正なユーザーが id のパラメータを id=2 に変更した場合、ドロップします。 SQL ステートメントは、対応するニュース情報の読み取りに加えて、データベース ニュース情報のドロップも実行しますが、後者のステートメントは不正です。
SQL インジェクション攻撃は正当な SQL ステートメントを使用するため、この攻撃はファイアウォールでチェックできません。また、SQL 言語標準に基づくあらゆるデータベースに適用できるため、特に有害です。それにもかかわらず、現在、SQL インジェクション攻撃を防ぐ方法は数多くありますが、具体的には、プリペアド ステートメントとパラメータを使用して解析のためにデータベース サーバーに送信し、パラメータは通常の文字として扱われます。この方法を使用すると、攻撃者は悪意のある SQL を挿入できなくなります。では、SQL インジェクション攻撃を防ぐにはどうすればよいでしょうか? 一般的に使用される方法をいくつか示します:
① 準備されたステートメントとパラメーターは、それぞれ解析のためにデータベース サーバーに送信されます。
② 関数 addslashes() を使用して、送信されたコンテンツをエスケープします。
③ PHP 設定ファイルで magic_quotes_gpc=on; をオンにすると、ユーザーがクエリした SQL ステートメントが自動的に変換され、SQL インジェクションの防止に重要な役割を果たします。
④ PHP 設定ファイルで register_globals を off に設定して、グローバル変数の登録をオフにします。
⑤ PHP 設定ファイルで、セーフ モードをオンにします(safe_mode=on;)。
⑥ SQL ステートメントを記述するときは、小さな引用符と一重引用符を省略しないようにしてください。
⑦ データベースのテーブルとフィールドの命名スキルを向上させる プログラムの特性に応じて重要なフィールドに名前を付け、推測しにくい名前を付けます。
⑧ エラー メッセージを制御し、エラー メッセージの出力をオフにし、エラー メッセージをログ ファイルに書き込み、Web サイトにエラー メッセージを公開しないでください。
2) データベース操作のセキュリティの問題。たとえば、ユーザーの権限は制限されておらず、更新、削除、挿入などの誤操作によりシステムのセキュリティ上の問題が発生します。
解決策は、異なるユーザーに異なる権限を付与して、権限を持つユーザーのみが特定の操作を実行できるようにすることです。
3) ユーザーの http リクエスト メソッドの検証はありません。悪意のあるユーザーは、Web サイトへの http リクエストをシミュレートして悪意のある攻撃を引き起こす可能性があります。このような攻撃を防ぐためには、ユーザーの http リクエストのアクセス元が信頼できるかどうかを確認し、http ヘッダーでリファラーをフィルタリングし、次の Web サイトへのアクセスのみを許可する必要があります。このドメイン内のサイト。
4) フォーム ソースの一意性の検証はなく、それが合法的なフォーム送信であるか、ハッカーによって偽造されたフォーム送信であるかを識別できません。
ハッカーによるフォーム送信の偽造を防ぐために、ワンタイム トークン トークンを使用できます。サーバーは特定の戦略を使用してランダムな文字列を生成し、それをトークンとしてセッションに保存し、要求されたページが送信されるときに、トークンは他の情報とともに隠しドメインの形式で送信され、トークンは受信ページに送信されます。受信した情報内のトークンがセッション内のトークンと比較されます。一致する場合にのみ、リクエストが処理されます。一致しない場合、リクエストは拒否されます。これにより、フォームのソースが確実に保証されます。は独自のもので、ハッカーによるフォーム送信の偽造を防ぎます。
21、PHP的开发框架有哪些?
CodeIgniter是一个轻量级的PHP开发框架,具有快速开发、灵活性高等优点,它特别适合互联网公司的快速迭代场景,因此很受欢迎,据说腾讯、去哪儿网等应用场景都使用了这个框架。CodeIgniter具有动态实例化、松耦合、组件单一性等很多优点。动态实例化是指组件的导入和函数在执行时才会生效。松耦合是指系统模块之间的关联依赖很少,确保系统具有很好的重用性和灵活性。框架内的类和功能都是高度自治的,具有非常好的组件单一性。
在CodeIgniter中,模型代表数据结构,包含取出、插入、更新数据库的这些功能。视图通常是一个网页,但是在CodeIgniter中,一个视图也可以是一个页面片段,如头部、顶部HTML代码片段。它还可以是一个RSS页面,或其他任一页面。控制器相当于一个指挥者,或者说是一个“中介”,它负责联系视图和模型,以及其他任何处理HTTP请求和产生网页的资源。
Zend Framework是完全基于PHP语言的针对Web应用开发的框架,与众多的其他PHP开发框架相比,Zend Framework是一个PHP“官方”的框架,它由Zend公司负责开发和维护。Zend Framework同样基于MVC模式,Zend Framework采用了ORM(Object Relational Mapping,对象关系映射)思路,这是一种为了解决面向对象编程与关系数据库存在的互不匹配现象的技术。简单地说,这种技术将数据库中的一个表映射为程序中的一个对象,表中的字段映射为对象的属性,然后通过提供的方法完成对数据库的操作。就这一点而言,Zend Framework很相似于现在流行的非PHP的开发框架Ruby on Rails。
ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,其遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式。
此外,还有FleaPHP、CakePHP等很多优秀的框架,此处就不一一列举,它们本质上都是基于MVC的架构,下面着重介绍一下在互联网公司使用比较广泛的CI框架。
3、PHP+mysql
1、问题:设教务管理系统中有三个基本表:
学生信息表S(SNO, SNAME, AGE, SEX),其属性分别表示学号、学生姓名、年龄和性别。
选课信息表SC(SNO, CNO, SCGRADE),其属性分别表示学号、课程号和成绩。
课程信息表C(CNO, CNAME, CTEACHER),其属性分别表示课程号、课程名称和任课老师姓名。
1)把SC表中每门课程的平均成绩插入另外一个已经存在的表SC_C(CNO, CNAME, AVG_GRADE)中,其中AVG_GRADE表示的是每门课程的平均成绩。
INSERT INTO SC_C(CNO, CNAME, AVG_GRADE)
SELECT SC.CNO, C.CNAME, AVG(SCGRADE) FROM SC, C WHERE SC.CNO = C.CNO GROUP BY SC.CNO
2)规定女同学选修何昊老师的课程成绩都应该在80分以上(包含80分)。
ALERT TABLE SC, S, C
ADD CONSTRAINT GRADE CHECK(SCGRADE>=80)
WHERE SC.CNO=C.CNO AND SC.SNO=S.SNO AND C.CTEACHER='何昊' AND S.SEX=
"女"
3)从SC表中把何昊老师的女学生选课记录删除。
DELETE FROM SC WHERE CNO=(SELECT CNO FROM C WHERE C.CTEACHER ='何昊') AND SNO IN (SELECT SNO FROM S WHERE SEX='女')
4)找出没有选修过“何昊”老师讲授课程的所有学生姓名。
SELECT SNAME FROM S
WHERE NOT EXISTS(
SELECT * FROM SC,C WHERE SC.CNO=C.CNO AND CNAME='何昊' AND SC.SNO=S.SNO)
5)列出有两门以上(含两门)不及格课程(成绩小于60)的学生姓名及其平均成绩。
SELECT S.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE)
FROM S,SC,( SELECT SNO FROM SC WHERE SCGRADE<60 GROUP BY SNO HAVING COUNT(DISTINCT CNO)>=2)A WHERE S.SNO=A.SNO AND SC.SNO = A.SNO GROUP BY S.SNO,S.SNAME
6)列出既学过“1”号课程,又学过“2”号课程的所有学生姓名。
SELECT S.SNO,S.SNAME
FROM S,(SELECT SC.SNO FROM SC,C
WHERE SC.CNO=C.CNO AND C.CNAME IN('1','2')
GROUP BY SNO HAVING COUNT(DISTINCT CNO)=2
)SC WHERE S.SNO=SC.SNO
7)列出“1”号课成绩比“2”号同学该门课成绩高的所有学生的学号。
SELECT S.SNO,S.SNAME
FROM S,(
SELECT SC1.SNO
FROM SC SC1,C C1,SC SC2,C C2
WHERE SC1.CNO=C1.CNO AND C1.NAME='1'
AND SC2.CNO=C2.CNO AND C2.NAME='2'
AND SC1.SCGRADE>SC2.SCGRADE
)SC WHERE S.SNO=SC.SNO
8)列出“1”号课成绩比“2”号课成绩高的所有学生的学号及其“1”号课和“2”号课的成绩。
SELECT S.SNO,S.SNAME,SC.[1号课成绩],SC.[2号课成绩]
FROM S,( SELECT SC1.SNO,[1号课成绩]=SC1.SCGRADE,[2号课成绩]=SC2.SCGRADE
FROM SC SC1,C C1,SC SC2,C C2
WHERE SC1.CNO=C1.CNO AND C1.NAME='1'
AND SC2.CNO=C2.CNO AND C2.NAME='2'
AND SC1.SCGRADE>SC2.SCGRADE
)SC WHERE S.SNO=SC.SNO
2、UNION和UNION ALL有什么区别?
UNION在进行表求并集后会去掉重复的元素,所以会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
而UNION ALL只是简单地将两个结果合并后就返回。因此,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据。
从上面的对比可以看出,在执行查询操作的时候,UNION ALL要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据,那么最好使用UNION ALL。例如,如下有两个学生表Table1和Table2。
Table1
C1 C2
1 1
2 2
3 3
Table2
C1 C2
3 3
4 4
1 1
select from Table1 union select from Table2 的查询结果为
C1 C2
1 1
2 2
3 3
4 4
select from Table1 union all select from Table2 的查询结果为
C1 C2
1 1
2 2
3 3
3 3
4 4
1 1
3、什么是数据库三级封锁协议?
众所周知,基本的封锁类型有两种:排它锁(X锁)和共享锁(S锁)。所谓X锁是事务T对数据A加上X锁时,只允许事务T读取和修改数据A。所谓S锁是事务T对数据A加上S锁时,其他事务只能再对数据A加S锁,而不能加X锁,直到T释放A上的S锁。若事务T对数据对象A加了S锁,则T就可以对A进行读取,但不能进行更新(S锁因此又称为读锁),在T释放A上的S锁以前,其他事务可以再对A加S锁,但不能加X锁,从而可以读取A,但不能更新A。
在运用X锁和S锁对数据对象加锁时,还需要约定一些规则,例如,何时申请X锁或S锁、持锁时间、何时释放等,称这些规则为封锁协议(Locking Protocol)。对封锁方式规定不同的规则,就形成了各种不同的封锁协议。一般使用三级封锁协议,也称为三级加锁协议。该协议是为了保证正确的调度事务的并发操作。三级加锁协议是事务在对数据库对象加锁、解锁时必须遵守的一种规则。下面分别介绍这三级封锁协议。
一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。一级封锁协议可以防止丢失修改,并保证事务T是可恢复的。使用一级封锁协议可以解决丢失修改问题。在一级封锁协议中,如果仅仅是读数据不对其进行修改,是不需要加锁的,它不能保证可重复读和不读“脏”数据。
二级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后方可释放S锁。二级封锁协议除防止了丢失修改,还可以进一步防止读“脏”数据。但在二级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。
三级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。三级封锁协议除防止了丢失修改和不读“脏”数据外,还进一步防止了不可重复读。
4、以下关于mysql_pconnect的说法中,正确的是( )。
A.与数据库进行多连接 B.与mysql_connect功能相同
C.与@mysql_connect功能相同 D.与数据库建立持久连接
参考答案:D。
分析:mysql_pconnect()函数打开一个到 MySQL 服务器的持久连接。
mysql_pconnect()和mysql_connect()非常相似,虽然只多了一个p,但它们有两个主要区别:当连接的时候本函数将先尝试寻找一个在同一个主机上用同样的用户名和密码已经打开的(持久)连接,如果找到,则返回此连接标识而不打开新连接。其次,当脚本执行完毕后到SQL服务器的连接不会被关闭,此连接将保持打开以备以后使用(mysql_close()不会关闭由mysql_pconnect()建立的连接)。所以,选项D正确。
[実際の質問 204] PDO は SQL クエリを実行することでデータベースと対話します。これはさまざまな戦略に分けることができます。どの方法を使用するかは、実行したい操作によって異なります。 DML ステートメントをデータベースに送信する場合、最も適切な方法は ( ) です。
A. PDO オブジェクト
B の exec() メソッドを使用します。 PDO オブジェクト ##C で query() メソッドを使用します。
D を結合するには、PDO オブジェクトの prepare() メソッドと PDOStatement オブジェクトのexecute() メソッドを使用します。上記のすべての方法が可能です
参考回答: A.
分析: PDO->exec() メソッドは主に、INSERT、UPDATE、DELETE およびその他の操作など、結果セットを返さない操作用です。返される結果は、現在の操作によって影響を受ける列の数です。手術。したがって、選択肢 A が正しいです。
5. PHP の mysql 一連の関数でデータを走査するために一般的に使用される関数は ( ) です。 A. mysql_fetch_row、mysql_fetch_assoc、mysql_affetced_rows
B. mysql_fecth_row、mysql_fecth_assoc、mysql_affetced_rows
C. mysql_fetch_rows、mysql_fetch_array、mysql_fetch_assoc
D. mysql_fecth_row、mysql_fecth_array、mysql_fecth_assoc
参考回答: D.
分析: 最も一般的に使用される mysql シリーズ関数. 一般的に使用されるトラバーサル データ関数には、mysql_fetch_row、mysql_fetch_array、mysql_fetch_assoc が含まれますが、mysql_fetch_rows は存在しません。
したがって、この質問の答えは D です。
6. テーブルのフィールド名を変更するための標準構文は ( ) です。 A. alter table テーブル名 add field word type [first|after]
B.テーブル テーブル名を変更してフィールド [最初|後]##C をドロップします。テーブル テーブル名を変更 元の名前を変更 新しい名前 新しいタイプ [最初|後]
D。テーブル テーブル名を変更 元の名前フィールド タイプを変更 [最初|後]
参考回答: C.
分析: テーブルのフィールド名を変更するための構文:テーブル テーブル名を変更元のフィールド名を変更新しいフィールド名タイプ;。
フィールド タイプを変更するための構文: alter table table name edit field name type;。
フィールドの追加: alter table table name add column field name type not null (またはデフォルト null); 新しいフィールドを追加すると、デフォルトでは空になりません (デフォルトは空です)。
フィールドを削除します: テーブル テーブル名を変更し、列を削除して新しいフィールド名を作成します。
以上が2018年PHP面接の質問の最新まとめ(回答付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。