PHP最新面接問題2019
21887 ワード
1、文字列「0」がPHPとjsでブール値がfalseかtrueかに変換される
php:false;php弱言語'0'は0と同じです.
js:true;文字列は空の文字列(')以外はtrue(''という中間にスペースがあるものを含む).
2、echo, print, print_r, var_dumpの違い
echo言語構造は、本物の関数ではなく、一度に複数の値を出力し、複数の値の間をカンマで区切ることができます.
printは関数で、1つの値しか出力できません.
print_r配列、オブジェクトを印刷できます.
var_dumpは配列、オブジェクト、データ型を印刷できます.
3、プログラム$a="www";settype($a, 'array'); (string)$a; floatval($a); echo gettype($a); 実行後の出力:
array理由:settypeは元の値のデータ型を変更し、string、floatvalは強制変換に属し、元の値のデータ型を変更しません.
4、PHPで泡立ちソートアルゴリズムを実現する.
//
for ($i = 1; $i < count($arr); $i++) {
// ,
for ($j = 0; $j < count($arr) - $i; $j++) {
//
if ($arr[$j] > $arr[$j + 1]) {
//
$temp = $arr[$j];
$arr[$j] = $arr[$j + 1];
$arr[$j + 1] = $temp;
}
}
}
5、サルの群れがぐるぐる並んで、1、2、…、nの順に番号をつけます.そして1匹目から数えて、m匹目まで数えて、それを輪から蹴り出して、その後ろから数えて、m匹目まで数えて、それを蹴り出して...、このようにひっきりなしに進んで、最後にサルが1匹しか残っていないまで、そのサルは大王と呼ばれていました.このプロセスをプログラミングしてシミュレーションし、m、nを入力し、最後の王の番号を出力する必要があります.
// $n $m
function fn($n, $m)
{
//
for ($i = 1; $i < $n + 1; $i++) {
$arr[] = $i;
}
$i = 0;
//
while (count($arr) > 1) {
// , , ,
if (($i + 1) % $m == 0) {
// m
unset($arr[$i]);
} else {
//
array_push($arr, $arr[$i]);
//
unset($arr[$i]);
}
$i++;
}
return $arr;
}
//
var_dump(fn(15,7));
6、分表、区分、分庫、難点は何ですか.どのようにしてデータを均一に保存しますか?
分表:大きな表のデータをいくつかの表に分けます.
分割テーブルは、垂直分割と水平分割に分けられます.
垂直分割すいちょくぶんかつ:フィールドを分割ふぃーるをぶんかつ;よく使わないフィールドを1枚の表に、大きなフィールドを1枚の表に、よく使われるフィールドを1枚の表に置くことができます.
水平分割:テーブルデータを分割します.id型取りでデータを分割できます.例えば、100枚のテーブル、user 0、user 1、user 2......、id%100で得られた残高は、どのテーブルに格納されますか.
分表難点:どのような戦略で分表するか.テーブルを分割した後、データをどのようにクエリーするか(どのテーブルにアクセスするか).
パーティション:すべてのデータは1つのテーブルにありますが、物理的なストレージデータは一定のルールに従って異なるファイルに保存され、ファイルは異なるディスクに配置することもできます.パーティションのタイプ:rangeパーティション、listパーティション、hashパーティション、keyパーティション.
一般的なパーティション化方法:
1、時間間隔によって、例えば年単位で、パーティションはデータを保存する.
2、hash(id div 1000000)は、自己増加したプライマリ・キーidに基づいて、100万のデータが1つのパーティションを確立することを示す.
ライブラリ:データをいくつかのライブラリに分けて格納します.垂直ライブラリと水平ライブラリに分けます.
垂直ライブラリ:テーブルに基づいてデータベースを分割し、同じタイプのテーブルに対してデータベースを分割します.例えば、ブログのデータベース、フォーラムのデータベースなどです.
水平ライブラリ:いくつかのルールに基づいて、同じテーブルのデータを異なるライブラリに分散します.例えば,ユーザidに基づいてユーザのブログ記事を5つのデータベースに分散する.
7、PHP中の一重引用符と二重引用符の違い.
一般的には、単一引用符と二重引用符は互いに通じるが、二重引用符の内部変数は解析され、単一引用符の内部変数は解析されない.
8、require()とinclude()の違い.
すべて別のページを導入します.
require()エラーが発生すると、プログラムが終了します.include()は実行を続け、エラー警告が表示されます.
実際のプロジェクトでは、require_が一般的に使用されます.one()のほうがいいです.
9、PHP中の超大域変数、マジック変数、マジック方法:
スーパーグローバル変数(9個):
参照先:https://www.php.net/manual/zh/language.variables.superglobals.php
$GLOBALS
$_SERVER
$_REQUEST
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION
マジック変数(8個):
__LINE__ファイル内の現在の行番号.
__FILE__ファイルのフルパスとファイル名.含まれるファイルに使用すると、含まれるファイル名が返されます.
__DIR__ファイルが存在するディレクトリ.含まれるファイルに使用すると、含まれるファイルがあるディレクトリが返されます.
__FUNCTION__関数が定義されたときの名前(大文字と小文字を区別)を返します.
__CLASS__クラスが定義されたときの名前(大文字と小文字を区別)を返します.
__TRAIT__Traitの名前(PHP 5.4.0新加).PHP 5.4.0からPHPはtraitsと呼ばれるコード多重化を実現した.
__METHOD__メソッドが定義されたときの名前(大文字と小文字を区別)を返します.
__NAMESPACE__現在のネーミングスペースの名前(大文字と小文字を区別).
マジックの方法:
参照先:https://www.php.net/manual/zh/language.oop5.magic.php
10、スタックおよびキュー
スタック:同じ端で挿入と削除を許可する特殊な線形テーブルです.
スタックは先進後出表とも呼ばれます.
注意:リニア・テーブルは最も基本的で、最も簡単で、最もよく使われるデータ構造です.線形テーブルのデータ要素間の関係は、1対1の関係です.
≪キュー|Queue|emdw≫:特殊なリニア・テーブルです.特殊な点は、フロントエンドでのみ削除操作を許可し、テーブルのバックエンドで挿入操作を行うことです.
キューは、先進的な先発テーブルとも呼ばれます.
11、対称暗号化と非対称暗号化
対称暗号化とは、暗号化と復号化が同じ鍵を使用することを意味するので、対称暗号化と呼ばれます.対称暗号化には秘密鍵として1つの鍵しかありません.
一般的な対称暗号化アルゴリズム:DES,AES,3 DESなど.
非対称暗号化とは,異なる鍵を用いて暗号化と復号化を行い,一方を公開公開鍵とし,他方を秘密鍵とする.公開鍵で暗号化された情報は、秘密鍵のみが復号されます.秘密鍵で暗号化された情報は、公開鍵のみが復号できます.
一般的な非対称暗号化アルゴリズム:RSA,ECC(モバイルデバイス用)、DSA(デジタル署名用)
12、時間複雑度と空間複雑度
アルゴリズムの複雑さは時間の複雑さと空間の複雑さに分けられる.
その役割:時間の複雑さとは、アルゴリズムを実行するために必要な計算ワークロードを指す.空間複雑度とは、このアルゴリズムを実行するために必要なメモリ空間を指す.
13、抽象クラスとインタフェースの違い
参照先:https://blog.csdn.net/sunlylorn/article/details/6124319
14、PHPマルチレベルディレクトリの作成
function makedir($path)
{
if (is_dir($path)){
echo " ";
}else {
$res = mkdir($path, 0777, true);
if ($res) {
echo " ";
} else {
echo " ";
}
}
}
15、PHPは1段のコードを書いて、複数のプロセスが同時に1つのファイルを書き込むことに成功することを確保する
function writeData($filepath, $data)
{
$fp = fopen($filepath, 'a'); // ,
do {
usleep(100); // ,
} while (!flock($fp, LOCK_EX)); //LOCK_EX ( ) ,
$res = fwrite($fp, $data . "
"); //
flock($fp, LOCK_UN); //LOCK_UN ( )。
fclose($fp); //
return $res;
}
16、PHPのis_writeable()関数にはBugがあり、1つのディレクトリ/ファイルが書けるかどうかは正確に判断できません.関数を書いてディレクトリ/ファイルが絶対書けるかどうかを判断してください.
次はCodeIgniterのis_ですreally_writable関数ソリューション、詳細は関数注釈を参照
バグには2つの側面があり、
1、windownsでファイルが読み取り専用属性しかない場合、is_writeable()関数はfalseを返します.trueを返すと、ファイルは必ずしも書き込み可能ではありません.
ディレクトリの場合、ディレクトリにファイルを新規作成し、ファイルを開くことで判断します.
ファイルの場合は、ファイル(fopen)を開くことで、ファイルが書けるかどうかをテストできます.
2、Unixでphpプロファイルでsafe_を開くmodeの場合(safe_mode=on)、is_writeable()も同様に使用できません.
プロファイルを読み込むsafe_modeがオンになっているかどうか.
/**
* Tests for file writability
*
* is_writable() returns TRUE on Windows servers when you really can't write to
* the file, based on the read-only attribute. is_writable() is also unreliable
* on Unix servers if safe_mode is on.
*
* @access private
* @return void
*/
if ( ! function_exists('is_really_writable')) {
function is_really_writable($file)
{
// If we're on a Unix server with safe_mode off we call is_writable
if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE) {
return is_writable($file);
}
// For windows servers and safe_mode "on" installations we'll actually
// write a file then read it. Bah...
if (is_dir($file)) {
$file = rtrim($file, '/') . '/' . md5(mt_rand(1, 100) . mt_rand(1, 100));
if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) {
return FALSE;
}
fclose($fp);
@chmod($file, DIR_WRITE_MODE);
@unlink($file);
return TRUE;
} elseif (!is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) {
return FALSE;
}
fclose($fp);
return TRUE;
}
}
17、phpで文字列のアルファベット以外の部分を除去する
preg_replace('/[^a-z]/i', '', $str);
18.文字列のアルファベット以外の部分を削除し、文字列の''を削除するa 2 b_などのアルファベットと文字列のアルファベットを大文字にします.ab 23 cはAbAbcを得た.
function getStr($str)
{
// [^a-z] a z ,i 。
$str = preg_replace('/[^a-z_]/i', '', $str);
$arr = explode('_', $str);
foreach($arr as $key=>$value){
// ucfirst()
$arr[$key] = ucfirst($value);
}
$str = implode('', $arr);
echo $str;
}
getStr('a2b_ab23c');
19、jsを使用して1ページ10 sに入った後にプロンプトボックスをポップアップし、プロンプトボックスの内容は「hello world」である.
setTimeout("alert('hello world')", 10000)
20、sql文クエリテーブルAのuser_を書くnameフィールドには、2回以上のすべてのデータが繰り返し表示されます.
SELECT user_name, COUNT(user_name) AS num
FROM A GROUP BY user_name HAVING num >=2;
注意:
21、redisメモリがいっぱいになったらどうする
参考ブログ:https://blog.csdn.net/qq_28018283/article/details/80764518
設定の上限に達すると、Redisの書き込みコマンドはエラーメッセージを返します(ただし、読み取りコマンドは正常に戻ることもできます.)または、Redisをキャッシュして構成淘汰メカニズムを使用することができます.Redisがメモリ上限に達すると古い内容が消去されます.5つのメモリ淘汰メカニズムがあります.具体的にはブログを参照してください.
22.PHPが二つの変数値を交換する方法(第三変数を使わない)
function exchange()
{
/**
* ,
*
*/
$a = "This is A"; // a
$b = "This is B"; // b
echo ' $a :' . $a . ', $b :' . $b, '
'; //
/**
* :
* $a:010101000110100001101001011100110010000001101001011100110010000001000001
* $b:010101000110100001101001011100110010000001101001011100110010000001000010
*
* , ,
*/
$a = $a ^ $b; // $a:000000000000000000000000000000000000000000000000000000000000000000000011
$b = $b ^ $a; // $b:010101000110100001101001011100110010000001101001011100110010000001000001
$a = $a ^ $b; // $a:010101000110100001101001011100110010000001101001011100110010000001000010
echo ' $a :' . $a . ', $b :' . $b, '
'; //
}