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

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

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

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

命名規則

命名規則は、プログラミングする際に識別子の名称である文字列を決める表記法のことです。ネーミング規則・ネーミング規約・命名規約とも呼びます。

Q&A

解決済

3回答

4771閲覧

プロパティ名のハイフン

aaaaaaaa

総合スコア501

PHP

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

命名規則

命名規則は、プログラミングする際に識別子の名称である文字列を決める表記法のことです。ネーミング規則・ネーミング規約・命名規約とも呼びます。

0グッド

1クリップ

投稿2016/06/02 10:56

編集2016/06/03 11:11

phpでは、プロパティ名にハイフンは使えません。が、下記のソースのように

str_relace("変換前の文字","‐","変換させたい文字がある変数")

を使うことで強制的にハイフンが利用できるみたいですが、
これは、変数を宣言するときにハイフンが使えないのであって、宣言後なら変数名に‐が使える、という認識であっておりますか。またなぜ、宣言するときに‐は使えないのでしょうか。

mymail.php

php

1class mymail { 2public $to; 3public $subject; 4public $message; 5 6private $headers = array(); 7 8public function __set($name, $value) { 9$this->headers[$name] =$value; 10} 11 12public function __get($name) { 13return $this->headers[$name]; 14} 15 16public function send() { 17foreach($this->headers as $key => $value) { 18$key = str_replace("_","-",$key); 19$others .= "{$key}:{$value}\n"; 20} 21mb_send_mail($this->to, $this->subject, $this->messagem $others); 22} 23}

php

1require_once "./mymail.php" 2$m = new maimail(); 3$m->to ="a@a.com" 4$m->subject = "題名"; 5$m->message ="内容"; 6$m->From = "s@s.com"; 7$m->X_Mailer = "MyMail 1.0"; 8$m->X_Priority = 1; 9$m->MSMail_Priority = "High"; 10$m->send(); 11

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

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

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

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

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

guest

回答3

0

ベストアンサー

これは、変数を宣言するときにハイフンが使えないのであって、宣言後なら変数名に‐が使える、という認識であっておりますか。

違います.既に回答にある通り

php

1$m = new MyMail(); 2$m->to ="a@a.com" 3$m->subject = "題名"; 4$m->message ="内容"; 5$m->From = "s@s.com"; 6$m->{'X-Mailer'} = "MyMail 1.0"; 7$m->{'X-Priority'} = 1; 8$m->{'MSMail-Priority'} = "High"; 9$m->send();

とすれば文法エラーになりません.しかし,これでは少し取り扱いにくいので,-_で代わりに記述させておいて,送信のためにsend()が呼ばれたタイミングで_-に変換してメール送信する,という処理を行ってくれている,ということです.

  • 実際にはto subject message以外はオブジェクトのプロパティではなくheadersの配列要素として格納されているだけ
  • headersに格納されるタイミングで変換はされていない

という点でも質問者さんの認識と食い違いがあると思います.もちろん以下のように,格納および取得のタイミングで変換を行うようにも書けますけどね…

php

1class MyMail 2{ 3 public $to; 4 public $subject; 5 public $message; 6 private $headers = []; 7 8 public function __set($name, $value) 9 { 10 $this->headers[str_replace('_', '-', $name)] = $value; 11 } 12 13 public function __get($name) 14 { 15 return $this->headers[str_replace('_', '-', $name)]; 16 } 17 18 public function send() 19 { 20 $others = ''; 21 foreach($this->headers as $key => $value) { 22 $others .= "{$key}:{$value}\n"; 23 } 24 mb_send_mail($this->to, $this->subject, $this->message, $others); 25 } 26}

結局「マジックメソッドを使えば-つきで格納できるか」という質問はミスリーディングで,本質は**「プロパティ名部分に-を使っても文法エラーにならないか」**というところにあります.未定義のプロパティをどう格納するかどうかは__set()に委ねられていますが,文法エラーの有無には無関係です.

結論は, {'プロパティ名'} のようにすればどんな値でもプロパティ名として記述できる」,です.

投稿2016/06/03 11:32

編集2016/06/03 11:49
mpyw

総合スコア5223

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

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

0

ちょっと変わった書き方をすれば、PHPでもハイフン入りの変数名、プロパティ名を使えます。

php

1// ハイフン入りの変数名 2${'foo-bar'} = 5; 3 4// ハイフン入りプロパティ 5$someObj -> {'foo-bar'} = 8;

…というより、str_replaceと変数名は関係しないと思うのですが、どういう状況なのでしょうか。

投稿2016/06/02 11:04

maisumakun

総合スコア145121

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

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

aaaaaaaa

2016/06/03 10:53

ご回答有難うございます。 申し訳ありません、詳細に記述します。
guest

0

str_replaceに関して。
第二引数は、第一引数で見つかった文字を置き換える文字の指定です。

投稿2016/06/06 01:03

ttyp03

総合スコア16996

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問