質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

1822閲覧

「isset」かつ「!empty」を関数化しておきたい

busi

総合スコア22

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/08/07 00:06

isset!emptyは一緒に書くことが結構多いと思います。
これを関数化しておこうと思いました。

PHP

1// このようにいつも一緒に書いているので関数化したい 2if ( isset($v) && !empty($v) ) { 3 echo 'issetで、かつ、emptyではない'; 4}

関数化したのがこちらですが、なぜかエラーです。

PHP

1function isset_noempty($v){ 2 return isset($v) && !empty($v); 3} 4var_dump( isset_noempty($nodata) ); // -> Undefined variable: nodata

何がいけないのかわからず、三項演算子をやめてみたり、issetだけにしたりしてもダメでした。

php

1// 三項演算子をやめてみた 2function isset_noempty($v){ 3 return ( isset($v) && !empty($v) ) ? true : false; 4} 5 6// issetだけにしてみた 7function isset_noempty($v){ 8 return isset($v); 9}

しかし、issetの実行はできましたし、$nodataを宣言しておけばできました。

php

1// issetはできた 2var_dump( isset($nodata) ); 3 4// $nodataを宣言したらできた 5$nodata = ''; 6var_dump( isset_noempty($nodata) ); 7 8

原因と対策を知りたいです。
宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

まったく同じ動作をさせるのは無理です

issetemptyは、変数が宣言されていなくても警告を出さないという特殊な実装になっていますが、これはPHP組み込みのものなので、PHP内の関数で実装することはできません(渡そうとした時点で変数が未定義なので、E_NOTICEが発生します)。

投稿2020/08/07 00:09

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

busi

2020/08/07 00:16

そうなんですね。みなさんいつも一緒に書いているのでしょうか?
退会済みユーザー

退会済みユーザー

2020/08/07 00:16

魔法の記号`@`があるかと。 function tmp($a){ var_export(isset($a)); } tmp(@$a); まぁ、使わんけどw
maisumakun

2020/08/07 00:17

というより、!empty($arg)がtrueであれば、issetも必ずtrueなので、!emptyだけで用は足りるはずです(未定義でもemptyは処理可能です)。
maisumakun

2020/08/07 00:18

> みなさんいつも一緒に書いているのでしょうか? 一緒に書く必要自体がないです(上記コメントを参照)。
busi

2020/08/07 00:22

失礼致しました。ありがとうございました。
guest

0

要件次第ですがnull合体演算子で対応できそうに思いますが、如何でしょうか。

投稿2020/08/07 00:15

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

busi

2020/08/07 00:22

新機能とは勉強になりました。ありがとうございました。
guest

0

該当する notice は、関数に変数を引数として渡そうとした段階で発生しています。
原因も対策もそれが理解できれば、実装可能かと。

バリデーションの一部としての実装ではないかと推測しますが、フレームワークに実装されている標準バリデーションをのぞいてみると勉強になると思いますよ。

投稿2020/08/07 00:11

編集2020/08/07 00:11
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

busi

2020/08/07 00:16

実装可能というと何がですか?実装不可能だと他の方から伺ったのですが、可能だとしたらコードを知りたいです。
退会済みユーザー

退会済みユーザー

2020/08/07 00:18

フレームワークの実装を参考にするといいって回答してるんですけど?
busi

2020/08/07 00:22

そうなんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問