PHP質問・雑談スレ4【初心者お断り(ROM歓迎)】 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
PHPに関する質問や雑談をするスレです。
初心者お断り(ROM歓迎)と書いてますが、初心者用のスレが用意されているからで、
難しい質問や話題をしなければいけないわけではありません。
PHPマニュアルの読み方を概ね理解していて、関数リファレンスが正しく読める方用のスレです。
PHP未導入の方や、手取り足取りが必要な初心者の方はム板のくだスレへどうぞ。
http://mevius.2ch.net/tech/ (【PHP】で板内を検索)
前スレ
http://medaka.2ch.net/test/read.cgi/php/1486956982/
その他リンク
・PHPマニュアル
https://secure.php.net/manual/ja/index.php
・コードテスト・貼り付け用
http://ideone.com/
・プログラミングのお題スレ (求PHPer参戦)
http://mevius.2ch.net/test/read.cgi/tech/1480579110/
このスレで扱う話題
・PHPのコード,設定や設定値に関する質問
・常識的範囲内でのコードレビュー依頼・改良相談
・PECL,PEARに関する質問
・PHP新機能やPHP関連トレンドの話題
(FWや非公式ライブラリの話題や特徴比較は良いが使い方から先の話題は専スレへ)
・PHPのバグ発見報告・公式に報告する前の検証依頼
このスレで扱わない話題
・直接関係ない○○特有の質問(専スレへ)
(HH,エディタ,IDE,サーバ,OS,DB,SQL,FW,テンプレート,非公式ライブラリ・アプリケーション等)
・PHPの改造 is_readableの説明には
>filename で指定したファイルあるいはディレクトリが存在し、 それが読み込み可能であれば TRUE、
といった具合に存在も確認するようなので
file_existsとis_readableって併用する必要ないですよね?
URL忘れちゃったけどIBMの記事でPHPのファイル事前チェック説明で両方指定してたので
あとis_readableの注意の
>この関数は、ディレクトリに対しても TRUE を返すかもしれません。 ファイルとディレクトリを区別するには is_dir() を使いましょう。
というのは、これはis_dir"を"ではなくて、is_dir"も"っていう解釈でOKですか?
is_dirのところ見ても
>ファイルが存在して、かつそれがディレクトリであれば TRUE、それ以外の場合は FALSE を返します。
としか書いてないのでreadのチェックまではしてないのかなと
手元の環境じゃdirを000にしたりすることが出来ないので確認できなくて
読み書き可能なディレクトリかを調べる場合どちらがいいでしょうか?
冗長な分には構わない感じで上でいいんですかね?
is_dir($dir) && is_readable($dir) && is_writable($dir)
is_dir($dir) && is_writable($dir) php ver7は、odbc_connectは実装されていないの?
関数がないっていうエラーになるんだけど。 >>160
はい、知ってます。
が、実際はサポートされていないようなのです。 >>161
エクステンションなんだからお前さんの環境で有効になってるかぐらい確認しろ ご自分の設定ミスなのにサポートされてないとか言っちゃったらそりゃ反感買う罠w 俺環は、Windowsなんだけどネ。
php v5 では、エクステンション無くてもodbc関数は動くのよ。
php v7 では、だめなの。
んで、php 7 のextフォルダ見たけど、それらしきファイルは入ってないの。
PHPのオンラインマニュアルには、
Windows 版の PHP には この拡張モジュールのサポートが組み込まれています。
これらの関数を使用 するために拡張モジュールを追加でロードする必要はありません。
て書いてあるし。
文句は甘んじて受けるから、odbc関数動かす方法教えてくれ。 いや、、、php.iniは確認したの? ; をちゃんと外した? php.ini のodbc関係は、php_pdo_odbc.dll だけ。
これは有効にしているので、pdo を使ってodbc接続はできる。
それなのに odbc_connect関数は使えないのよ。
php -i で見ると、v5 には、
ODBC Support => enabled
が表示されるのに、v7 は表示されない。
だからサポートされてないんじゃないかな〜って思うの。
162, 163よ、早く答え教えろw すまん。
php_odbc.dll ってのがあったw 確認しろと言われても確認すら出来ない
しかもちゃんと謝れない
ゴミクズですわ 自分よりもマニュアルが間違ってるって発想する人間だし www.example.comみたいなホスト名からドメイン名の部分をとりたいです。
最初に考えたのはドットで配列に区切って後ろの2つをくっつけるですが、
ne.jpとかのドメインを思い出して、その場合3つをくっつけないといけません。
既知のドメインをリスト化するのは大変だし、新しいものに対応するのも難しいのですが、
なんかいい方法や関数ないでしょうか?
ne.jpやco.jpがneやcoの部分が2文字まで、exampleの部分が3文字以上じゃないと無理とかなら、
まだやりようはあるんですが、そういったルールはないですよね? 2つとか3つとかそれぞれで
checkdnsrrでチェックするとか >exampleの部分が3文字以上じゃないと無理とかなら、
三文字以上じゃなきゃ取れなかったと思うから2以下なら3つっくっつければいいんじゃね? >>173-174
>>173さんの方法でうまくいきました。
レスどうもありがとうございました。 無名関数でuseというキーワードがありますが、これって引数で渡すのと比べた違いは、
>引き継がれた変数の値は、関数が定義された時点のものであり
これだけですよね?
両者とも参照渡しは可能で、globalのように親スコープの変数を変えることもできないので。
PHP5では無理なようですが即時関数のような振る舞いを期待して、
定義後にすぐ呼び出すならuseキーワード使ったほうがいい感じですかね? >>176
特に理由がなければuseするわ
引数にすると2回書かにゃならんし
あと即時関数はPHP7からは
(function (...) {...})(...)
で可能だしPHP5でも
call_user_func(functuion (...) {...}, ...)
で可能だったと思うが >>177
ありがとうございます。
やっぱ基本useがいいですね。自分も書いてて2回書くのは気になりました。
ただ書いてて気づいたのは、$thisはuseで渡せないようなので、
その時はやむを得ない感じかなと思いました。
call_use_funcは知りませんでした。どうもありがとうございます。
JavaScriptもやっていて、無名関数の書式に慣れてるし、
もし今使ってるレンサバがPHP7対応したら置き換えやすいので、
とりあえずこのままで行きたいと思います。 http://php.net/manual/ja/class.domelement.php
DOMクラスに多いんですが
publicでreadonlyなプロパティがいっぱいあります
ためしに自分のクラスにpublic readonlyとか書いてみたらparse errorになりました
マジックメソッドの__getを使うとreadonly実装出来るようなこと書いてて出来るには出来るのですが
これってgetterのオートローダーみたいな感じで
実質中身はprivate protectedなプロパティにアクセスしてるだけだと思うのですが
publicでreadonlyなプロパティというのは実装可能なんでしょうか? >>179
Cでエクステンション書けばPHPの文法を超えることが実現出来る >>180
なるほど
やっぱりPHPだけじゃ無理でそういうレベルの話だったんですね
DOMElement->tagName変えようとしたらmain()とかでエラー出てたので
なんかそんな感じはしました
レスどうもありがとうございました でもまぁreadonlyプロパティとか欲しいよね実際 if (!preg_match('/regex/', $arg))
{
throw new xxxException();
}
LogicException系ですが、
引数が期待する値でないのでこれはInvalidArgumentExceptionですか?
それとも定義したデータドメインにあってないのでDomainExceptionですか?
いまいちExceptionの使い分けがわかりません。 >>185
InvalidArgumentExceptionのドキュメントを読むとTypeError相当のものに見える
DomainExceptionのサンプルからもその用途にはこちらが向いているだろう
// サンプルなんだろうけどその判定式はstrposが最良では >>186
'/'.preg_quote($regex, '/').'/'と書くべきでしたね。
ややこしくしてすみません。
DomainException使おうと思います。
レスどうもありがとうございました。 なんで標準Exceptionだけで全てを仕分けしようとしてるん… じゃ>>187に例外命名してみ
たぶん無駄に終わるだけだから mysqlなんですが
外部結合などの依存関係を無視して強制的に
データを削除したいんですがどうしたら良いですか? pcntlが有効になっていない環境で、
Aさんがsleepしているのを Bさんが起こす
ということをしたいのですが、どうしたらよいでしょうか
pcntlがあればAさんはsignalハンドラ定義してsleepして
BさんがSIGUSR1でも投げればよいのですが・・・ いや〜噂には聞いてたがさ
F/Wも増えてるしphp開発の話も多いし
大丈夫だろうと思ったんだよ
実際にphp屋に転職したらマジ吐きそう・・・ 今時PHPに固執してる会社なんて
スパゲッティ屋に決まってるだろ
さっさとpythonかgolangやってる会社に転職しろ まともな国公立の情報工学部出身者(自然言語処理系)ならpythonがデフォだから
pythonメインの会社は技術レベルが高い(一昔前はPerlだったが)
そんなpythonプログラマが速度や省メモリ性能、並列化の問題に直面すると選ぶのがgolang
こっちは更に技術レベルが高い(上に先見性もある)
http://isucon.net/archives/51000131.html
ISUCON(いい感じにスピードアップコンテスト)では
本戦出場の53.3%がgolang使い pythonも淘汰されてるやんけぇ!
Ruby以下やん PHPはインタプリタ言語で開発速度優先
Goはコンパイラ言語で実行速度優先
一長一短だぞ
Goのコンパイル時間はC言語と比べるとめちゃ早いが
インタプリタ言語よりは遅い kuinは流石に泡沫言語すぎるな
githubで公開されてない、萌え絵を全面に出してる時点で
評価は得られないだろう Goむずかしいやん
PHPくらいのがチンパンにはちょうどいいんや PHPer目線でGoのダメ出しをすると
type User struct {
name string
}
func (u *User) hello() string {
return "hello," + u.name;
}
u := &User {"PHPer"}
fmt.Println(u.hello())
はぁ〜〜、もうこれね
メソッド定義するだけでもレシーバーをポインタ型にするか値型にするかで混乱するし
そもそもclassの枠内でメソッド定義したいのよ、なんでstructと分離する感じにしちゃったの?
class User{
name string
func hello() string{
return "hello," + this.name;
}
func init(s string){
this.name = s
}
}
u := new User("PHPer")
u.hello()
こっちのほうが可読性高くね? GOは新言語が取り入れるべきヌル安全性がない
これは糞 自宅鯖でWordPressを動かしてるんだが、ログイン状態でPCかブラウザがクラッシュして再起動すると、必ずログアウトされてる
PHPってブラウザ再起動したらセッション無効にするみたいな設定あったっけ?
どういう仕組みでこうなるのか調べたけど案外情報が無くてわからんかった
ブラウザの設定なんでないの? それも考えたけど別のサイトではそうならないんだよな >>210
>自宅鯖+PC再起動
セッションはメモリ上に保存されてるからね、ログアウトも仕方ないね
ブラウザの場合はわからんが、ブラウザじゃなくて鯖が再起動になってるんじゃないの 更に調べたらやはりブラウザのせいぽい
Operaでだけ発生しChromeではならない、が、何故なのかはまだわからない
>>213
鯖は再起動になってない operaが再起動でクッキー消失する設定になってるかなんかじゃないか
あと今のoperaは使わんほうがいいと思うぞ
せめてvivaldyのほうがいい >>215
同じOperaでもサイトによって挙動が違って謎
どこかにドメイン別の設定でもあるのだろうか… operaは中国企業が買収したし何がどうなってるかわからん
使うの怖いわ
原因も調べるだけ時間の無駄
ってかそもそも、今どの層が使ってるんだ? うーんVivaldyでも起きた…Operaの問題というわけでもないようだ
PHPのセッションに、ブラウザ閉じたら終わるみたいな機能ないよね?そもそも検知できないと思うし クッキーの有効期限がブラウザ閉じるまでになってるんだろ >>213
>セッションはメモリ上に保存されてるから
こいつ、何言ってんの? >セッションはメモリ上に保存されてる
でしょ
>>221は何言ってるの? 実装次第だが少なくともPHPのセッションはデフォルトでファイルなはず
自分が使用してるバージョンではそうなってる
ブラウザは終了時にセッション(クッキー)を削除するのでそこでセッションは切れる
ただ異常終了した場合は前回のセッション復帰を試みるブラウザもある(ブラウザ次第)
PHPがセッションを削除するタイミングは
たしかアクセスがあった時にランダムで有効期限が切れたものを削除してた気がする
なのでサーバ再起動した場合でもまだ有効期限内なら確立されるはず(ブラウザ側で残ってれば)
サーバ再起動時にPHPのセッションを削除するようにしてる場合はこの限りではない >>218
phpのセッションは、ブラウザのcookieに保存されたセッションIDと
サーバ側のセッションファイル(メモリキャッシュを使ってる場合はメモリ)の
突き合わせで行われる。
だからブラウザのcookieとサーバのセッションファイルを調べればだいたい原因が分かるよ。
たぶんcookieがないかセッションIDが変わってるだけだと思う。
君らのレス見てると、案外phpのセッションを理解してる人は少ないみたいだな。
まあたしかに分かりにくいけど。 どちらかというとcookieの仕組みを理解してないだけだろう
俺も昔勉強したきりでもう覚えてないが
expiresが設定されてないとブラウザ終了時に消されるんだっけか >>225
そう。
最近はフレームワークが面倒な作業を全部やってくれるから、
新人(でなくてもか)がphpのセッションを学ぶ機会がないんだよね。
session_start()さえ自分で書かないんだもん。
そりゃ何やってんだか分からんって。
できればこの辺のことは学校でやってきて欲しいんだがな。 ブラウザ終了時にクッキー消される場合があるのはわかるが、異常終了時はどうなるんだろう?
再起動時に前回異常終了したことを検知して、正しく処理をするのかな?その結果クッキーは消えると 異常終了時はブラウザがCookieを消すという動作が出来てない可能性があり、
この場合ブラウザには残ってるということになる。
これらのCookieをどう次回の起動時にどう扱うかはブラウザ次第。
勝手に復元したり、復元するか聞いてきたり、リセットして通常起動をしたり。 中途半端に勉強してフレームワークを変にカスタマイズして
セキュリティホールができるよりかは何も出来ない方がいいという昨今 そうやってできたセキュリティホールなんてそう簡単に検知出来ない
ソースがオープンであることが一番怖いのだよ
逆にオープンであるといろんな視点から修正も可能になるから
堅牢なものに仕上がるわけだけど Googleがemojiのユニコード化に乗り出したときにperlだとemojiをutf8にする決定版モジュールがすぐに出たし
PHPだと暫定的にHTML_Emojiを使ってたけど5.4以降の関数を使った新しいモジュールが見つからない
何かおすすめの携帯emoji自動変換ないでしょうか PHPerはないものを生み出すのが得意になるように
言語が誘導してくれてるんだから自分で作るんだ!!!!!! 車輪の再発明が大好きだからな
趣味でやる分の傾向としては別に悪くはない 誰でも簡単にネットで稼げる方法など
参考までに、
⇒ 『半藤のブブイウイウレレ』 というサイトで見ることができます。
グーグル検索⇒『半藤のブブイウイウレレ』
MHWTZ79CQR PHPから大量のデータを送る方法を教えてください
思いついたのが、
1、一旦ファイルに保存してファイルの一覧をクライアントに送る
2、クライアントから順次ファイルの送信を要求する
です Socket.ioなどを使えということでしょうか?
勉強してみます npmがエラーはきまくりで進まなくなった。。。
なにこれ
Error: Cannot find module ....\npm-cli.js
socketは。。。portとかまためんどくさい話がありそうで。。。 >>239は同期が必要なゲームデータのやり取りを想定してると思っての答えなんだろうけど。
1や2見るとそういう用途とは思えないな。
1がいまいち意味わからないけど。 スレチとか低レベ質問だったらすまん
headerを使用したリダイレクトとApacheのリバースプロキシを利用したリダイレクトはどう違うんでしょうか?
レスのヘッダーの中身が違うんですか? headerはブラウザがページ遷移を処理する
リバースプロキシはサーバが接続処理する
前者はリダイレクト前後でURLが変わるが後者は見かけ上変化しない >>246
ありがとうございます
今朝検証したらその通りになりました
ちょっとハマってたので助かりました 良くできてるプラグインとかに感動しなくなってしまった phpのf/wってルートネームスペースにエイリアス置きたがるけどさ
use句があった方が圧倒的にわかりやすいと思うんだが、なんか理由ってあるのん? 同一サーバでドメインごとにphpのバージョンを切り替えたいんですが
どうしたらいいですか? KubernetesでドメインごとにPods分ける phpexcelを使って、読み込んだエクセルのマクロを実行する方法はないでしょうか PHPExcelを使って, では不可能(VBAは誰が実行するんだ?)
何らかの形でVBAの実行環境を構築出来ればやれるはやれるだろう
VBSならWindows Script HostがあるがVBAじゃあExcelのCOMを使うしかなかろうが
http://php.net/manual/ja/book.com.php PHP5時代ではコンストラクタはクラス名ではなく__constructを使う
public修飾子はつけるというルールがSHOULDだったと思うのですが
PHP7時代でもそうなのでしょうか? >>257
http://php.net/manual/language.oop5.decon.php
> Old style constructors are DEPRECATED in PHP 7.0.
https://www.php-fig.org/psr/psr-2/#43-methods
> Visibility MUST be declared on all methods. ■ このスレッドは過去ログ倉庫に格納されています