20190307のPHPに関する記事は13件です。

三項演算子と??(ハテナハテナ)と?:(ハテナ:)

はじめに

この記事では、三項演算子とnull合体演算子(??),そしてエルビス演算子(?:)についてまとめています。

それぞれの違い

まずは、実際にコードをみてみます。

$x = null;
$y = 0;
$z = 1;

// 三項演算子
$a = $x ? 'true' : 'false'; // 'false'
$b = $y ? 'true' : 'false'; // 'false'
$c = $z ? 'true' : 'false'; // 'true'
$abc = $xyz ? 'true' : 'false'; // Notice Undefined variable

// エルビス演算子(実は三項演算子)
$a = $x ?: 'false'; // 'false'
$b = $y ?: 'false'; // 'false'
$c = $z ?: 'false'; // 1
$abc = $xyz ?: 'false'; // Notice Undefined variable

// null合体演算子
$a = $x ?? 'false'; // 'false'
$b = $y ?? 'false'; // 'false'
$c = $z ?? 'false'; // 1
$abc = $xyz ?? 'false'; // false

エルビス演算子と三項演算子は

三項演算子, エルビス演算子

この二つは、条件式が真の場合に評価される値が条件式そのものか、そうでないか、という点で異なっているだけです。
これらは、条件式がtrueかfalseか、が重要です。
条件式がundefinedの場合には、Noticeエラーが発生します。

// 三項演算子
【条件式】 ? 【trueの場合に評価される式】 : 【falseの場合に評価される式】

// エルビス演算子(二項演算子)
【条件式(trueの場合に評価される式)】 ?: 【falseの場合に評価される式】

null合体演算子

null合体演算子の場合に重要なのは、条件式がnullであるかどうかです。
undefinedの場合もnullという判定になるのでNoticeエラーが発生せずに値が返ってきます。


【条件式(nullでない場合に評価される式)】 ?? 【nullの場合に評価される式】

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPで複数の値をreturnする[備忘]

やりたい事

  • 複数の値を一回のreturnにまとめたい

環境

  • PHP 7.2.6
  • CakePHP 3.6.13

サンプルコード

  • 生のPHPコードの場合
private function samples()
{
    $fruits1 = 'apple';
    $fruits2 = 'banana';

    return [$fruits1, $fruits2]; // もしくは、array($fruits1, $fruits2);
}

list($fruits1, $fruits2) = $this->samples();

echo $fruits1; // => apple
echo $fruits2; // => banana

解説

  • samplesアクション

    • $fruits1$fruits2を定義
    • returnする時に配列にする
  • list関数

    list — 配列と同様の形式で、複数の変数への代入を行う
    引用元:http://php.net/manual/ja/function.list.php

    • list関数を使用し、samplesアクションの返り値を受け取る

所感

  • 1回のreturnで済む事は気持ちいい
  • functionに切り出す程でもないけど、2つの値をそれぞれ呼び出し元に返したい場合の解消手段になり得る
  • 見慣れないせいか、直感的なコードの可読性はそこまで高くない?
  • 世間一般的に、こういう手法を使うのだろうか?

おまけ

Twitterやってます!外部のエンジニアの方ともどんどん繋がりたいと考えていますので、是非フォローして頂ければと思います!@Tatsuo96
ブログ始めました!
https://note.mu/tatsuo_iriyama

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初めてPHPを使ってサービスを作った話。

サービスってもんはな、ユーザーがいないと忘れるもんだよ....。

はじめに

ではまず最初に、なんで僕がこのサービスを作ろうと思ったのかということですが、このサービスを作る前にLINEのAPIで遊んでいて、その続きでTwitterAPIを触っていて、どうせならTwitterAPI使って何か作るかと思って作りました。
(需要ないとかいうのやめて((()

どういうサービス?

最後にツイートしたツイートの情報が見れるサービスです。
キャッチコピーはあなたが一番最後にツイートした内容はなんだったのか、ツイ廃の人はわかってるかもしれません。でも普通の人ならあまり覚えていないはず....。
このサービスは直前のツイート一件の情報を取得して表示します。あなたは最後に何をツイートしたのでしょうか?

僕自身なんでこんな文が思いついたのかわかりません(おい

まぁ、なんか作りたかったからとりあえずこれにしようって思ってたら結局このままになりました。

Qiita途中まで書いてたんですけど、下書きのまま放置してたら忘れちゃってその間に色々サービス変わってました。
これが今のキャッチコピー?です↓
このサービスは最新のツイートから100ツイート遡ったツイート一件の情報を取得して表示します。

LastTweetViewerはここからどうぞ。
あ、言っとくとこの間のリニューアルでバグ発生して表示されなくなったので無意味です。

使ってるサービスとかツールとか

  • GitHub
  • Heroku
  • TwitterAPI
  • IntelliJ IDEA
  • Postman

まあいたって普通の構成ですね。

苦労したとこ

PHPをまず触ったことがなかったので、これが本当に一番最初。
だからバグばっか

よかったところ

一般公開した時は結構ユーザー来てくれた

その他

公開した時のツイート

詳しいのは暇あったら書きます。はい ←また忘れるやつ(((

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GitHubからさくらのレンタルサーバに自動デプロイ

はじめに

GitHubからさくらのレンタルサーバーに自動デプロイしたいな、と思って調べたら記事が何個かあった。しかし少し変わった部分があったので再まとめ的な感じ。
参考記事は最後に貼っておく。

gitの導入

SSHログイン

ssh アカウント名@アカウントのドメイン.sakura.ne.jp

Bashに変更

bash

curl-develのインストール

こいつが無いと、httpsでのcloneができなかった。

curl Downloadより。
ここでは7.64.0

作業ディレクトリは$HOME/local/src。インストール先は$HOME/local

mkdir -p $HOME/local/src
cd $HOME/local/src
wget https://curl.haxx.se/download/curl-7.64.0.tar.gz
$ tar zxvf curl-7.64.0.tar.gz
$ cd curl-7.64.0.
$ ./configure -prefix=$HOME/local
$ make
$ make install

gitのインストール

まずGoogle Code Archive git-coreにてgitのソースコードの確認。ここでは1.9.0を使用する。

./configureにオプションを少々追加する。

cd $HOME/local/src
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/git-core/git-1.9.0.tar.gz
tar zxvf git-1.9.0.tar.gz
cd git-1.9.0
./configure -prefix=$HOME/local -with-curl=$HOME/local --enable-pthreads=-pthread
gmake all
gmake install

パスの追加

別のディレクトリにインストールしたらスルー。

cd ~/
vim .shrc

pathに追記。

set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin /usr/X11R6/bin $HOME/local/bin $HOME/bin )

GitHubからcloneする

cloneするディレクトリは$HOME/www/test/

cd ~/www/test
git clone https://github.com/*******/*******.git

デプロイ用php作成

masterブランチをpullする場合。

deploy.php
<?
exec('git -C /home/アカウント名/www/test pull origin master', $op);
echo "<pre>";
var_dump($op);
echo "</pre>";
?>

webhook設定

GitHubのリポジトリ設定にて
URLに作成したphpファイルのURLを指定。

SnapCrab_NoName_2019-3-7_22-26-8_No-00.png

trigger設定

今回はReleasesのみにチェックを入れた。
みなさんのお好みで。

SnapCrab_NoName_2019-3-7_22-27-49_No-00.png

ここにも書いてあるけど、セキュリティには気をつけなければ…

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Macにcomposerをinstall

$ curl -sS https://getcomposer.org/installer | php
All settings correct for using Composer
Downloading...
Composer (version 1.8.4) successfully installed to: /Users/{user}/Documents/src/composer.phar
Use it: php composer.phar

$ sudo mv composer.phar /usr/local/bin/composer
$ composer -V
Composer version 1.8.4 2019-02-11 10:52:10

$ which composer
/usr/local/bin/composer


  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel mailTrapでメール送信テスト 備忘録

本記事で達成できること

Laravelでmailtrapを利用したメール送信テストを実装できるようなる。
mailtrapとはメールを送信しても実際の宛先には飛ばさず、Webサイトから確認できるというサービス。

開発環境

cloud9
php 7.0 ※バージョン確認コマンド

php -v

Laravel 5.3.31 ※バージョン確認コマンド

php artisan --version

mailTrapでユーザー登録

以下の記事を参考に登録を行う。
メールの絡む開発にはmailtrapがおすすめ

Laravel側の設定

.env ファイルを開き、以下の初期値を変更する。

変更前:

MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

変更後:

MAIL_DRIVER=smtp
MAIL_HOST= smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=[MailtrapのUsername]
MAIL_PASSWORD=[MailtrapのPassword]
MAIL_ENCRYPTION=null

上記のMAIL_USERNAMEMAIL_PASSWORD=の項目はmailTrapから情報を参照。
スクショ.png

メール送信のスクリプト

以下コマンドでメーう送信のために必要なクラスを生成。

php artisan make:mail SendMail

cloud9上の以下のディレクトリ配下にファイルが生成されていることを確認。

app/Mail/SendMail.php

以下のようなファイルが生成される。

SendMail.php
<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class SendMail extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('view.name');
    }
}

build()メソッドに変更を加える。

public function build()
{
    return $this
        ->from('example@example.com')
        ->subject('テスト送信完了')
        ->view('emails.test');
}

※ 変更を加えたview('emails.test');にてメールテンプレートを作成するように記述しているが、テンプレート作成方法に関しては割愛させていただきます。

生成したファイルをインスタンス化してメールを送信するために、
とりあえずroutingは以下のように設定した。

web.php
// つまり "TestMailController" の sendメソッド を利用してメールを送信する
Route::get('/mail','TestMailController@send');

cloud9上の以下のディレクトリ配下に,

app/Http/Controller

TestMailControllerファイルを作成。

TestMailController.php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use App\Mail\TestMail;

class TestMailController extends Controller
{
    public function send(){
        return Mail::to('ryoma@gmail.com')->send(new SendMail());
    }

}

sendメソッドを発火させればmailTrapのダッシュボード上で
メールを受信できていることを確認できる。

以上

参考にした記事:MailtrapでLaravelの簡単メール送信テスト

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPで日付取得する方法、指定した日付から曜日を取得する方法

日付取得には大きく2つの方法がある。

①date(): 欠点として、2038年1月19日 までしか使用できない。
②datetime

指定した日付から曜日を取得する方法

strtotimeで取得する
$date2=date('w',strtotime('20190307'));
echo $date2;

と入力すると、2019年3月7日の曜日が数値で出てくる。
【曜日に振り分けられている数値】
0:日
1:月
2:火
3:水
4:木
5:金
6:土

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

php-master-changes 2019-03-06

今日はテストの不要コード削除、実質的に ZPP の挙動テストとなっているだけの過剰なテストコードの削除、truecolor の画像を GIF 出力する際にインタレースフラグが無視される問題の修正、ドキュメントの更新、符号付整数をシフトし過ぎて未定義挙動になっていた箇所の修正、コンパイラの条件式の整理 / 関数分離のリファクタがあった!

2019-03-06

carusogabriel: Remove unnecessary check for always available extension

nikic: Remove more zpp error tests

cmb69: Fix #77700: Writing truecolor images as GIF ignores interlace flag

cmb69: Prolong my extension maintainership

smalyshev: Update maintainership years

smalyshev: Fix shifting signed values too far

rjhdby: Cleanup some checks in zend_compile.c

nikic: More zpp error/variation test removals

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PhpStorm でファイル作成時にコードテンプレート使うと少し捗るよ (IntelliJ とかも同じはず。)

PhpStorm (IntelliJとかも) に、 Project Tree などから、コンテキストメニューを呼び出し、そこから指定のファイルを作成する機能があります。(あるいは、 cmd + n)

こんなやつ。

スクリーンショット 2019-03-07 12.24.09.png

例えば、 "PHP Class" を選べば、以下のようなダイアログが出てきます。

スクリーンショット 2019-03-07 12.26.22.png

この画像の例は laravel を使った Project なので、 composer.json から適切に NameSpace 等を読み込んで事前に入力済み状態になっています。

で、例えば、 NameHogeController と入力して OK を押すと以下のようなファイルが生成されます。

<?php
/**
 * Created by PhpStorm.
 * User: hokutoasari
 * Date: 2019-03-07
 * Time: 12:28
 */

namespace App\Http\Controllers;


class HogeController
{

}

これはこれで良いのですが、 Code Template を使うことで、もうちょっと便利になります。

Code Template を設定して使ってみる

Preferences -> Editor -> File and Code Templates を開きます。

で、例えば、 "PHP Class" を以下のように編集します。

スクリーンショット 2019-03-07 12.31.10.png

<?php
declare(strict_types=1);
#if (${NAMESPACE})

namespace ${NAMESPACE};

#end

final class ${NAME} {

}

こうしておくと、さっきの cmd + n から "PHP Class" を選択して生成されるコードが以下になります。

<?php
declare(strict_types=1);

namespace App\Http\Controllers;


final class HogeController
{

}

declare(strict_types=1); を先頭に入れて、 namespace を入れて、 class には final 修飾子を付けて、といった具合に Code Template に指定した内容に従って生成されます。

他にも使える値が Code Template の設定画面に書いてあるので、お好みの設定にすると捗る。

ご参考までに

ちなみに、僕は以下の設定を行っています。

PHP File

<?php
declare(strict_types=1);


PHP Class

<?php
declare(strict_types=1);
#if (${NAMESPACE})

namespace ${NAMESPACE};

#end

final class ${NAME} {

}

PHP Interface

<?php
declare(strict_types=1);
#if (${NAMESPACE})

namespace ${NAMESPACE};

#end
interface ${NAME} {

}

PHP Trait

<?php
declare(strict_types=1);
#if (${NAMESPACE})

namespace ${NAMESPACE};

#end
trait ${NAME} {

}

PHPUnit Test

<?php
declare(strict_types=1);

#if (${NAMESPACE})
namespace ${NAMESPACE};
#end

#if (${TESTED_NAME} && ${NAMESPACE} && !${TESTED_NAMESPACE})
use ${TESTED_NAME};
#elseif (${TESTED_NAME} && ${TESTED_NAMESPACE} && ${NAMESPACE} != ${TESTED_NAMESPACE})
use ${TESTED_NAMESPACE}\\${TESTED_NAME};
#end
use Tests\Unit\TestCase;

final class ${NAME} extends#if(${NAMESPACE}) TestCase #else PHPUnit_Framework_TestCase #end{

}

./tests/Unit/TestCase.php を用意して、 Unit Test に必要そうな便利メソッドをここに書いてるので、 use Tests\Unit\TestCase; して、 extends TestCase となるように書いてます。

デフォルトの laravel Project 状態なら use Tests\TestCase; で良いんじゃないかな。

おまけ

cmd + n で表示させて状態で、おもむろに "php" とか入力するとインクリメンタルサーチになって便利ですよ。

スクリーンショット 2019-03-07 12.25.54.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPのCarbonで特定の日付の曜日を日本語で表示する

PHPのCarbonで特定の日付の曜日を日本語で表示する

// ローカルを日本語設定にする
setlocale(LC_ALL, 'ja_JP.UTF-8');
$dayOfWeek = Carbon::parse('2019-03-07')->formatLocalized('%a');

echo $dayOfWeek // 木

参考:

Carbon
omoonさんブログ

お願い

これよりいい方法があれば教えていただけると助かります!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP】Gmail APIでメールを取得する

はじめに

Gmail APIのリファレンスが全部英語なので読むのに時間がかかり、苦労したので日本語メモ用に残しておきます:open_hands:

公式ドキュメント

Gmail API
Class Google_Service_Gmail_Message 
↑いろんなクラスがあるので、欲しいメソッドが既に存在しているかもしれません。まずは欲しい機能が実装済みでないか調べましょう。

前準備

  • PHP5.4 以上
  • Composer が利用可能である
  • Gmailが使えるGoogleアカウントがある

クイックスタート

1. [ENABLE THE GMAIL API] ボタンをクリック

スクリーンショット 2019-02-20 16.24.29.png

クリックすると以下のようなウィンドウがでてくるので、 [DOWNLOAD CLIENT CONFIGURATION]
というボタンをクリック
スクリーンショット 2019-02-20 16.42.57.png

credentials.jsonというファイルがダウンロードされるので、作業ディレクトリにファイルを移動する。

2. Google Clientライブラリをインストール

$ composer require google/apiclient:^2.0

3. サンプル作成

4. サンプル実行 && アカウント認証

$ php quickstart.php 

4-a. ターミナルにリンク先が表示されるので、コピペしてブラウザで表示
4-b. 画面に従いアカウント認証をする
4-c. 認証コードが表示されるので、コピーする
スクリーンショット 2019-02-20 16.55.27.png
4-d. ターミナルに貼り付け、Enter

5. 認証成功! ラベル一覧が表示されます

以降は、作業ディレクトリに追加されているtoken.jsonを読み込んで認証するので、いちいちGoogleアカウントの認証をする必要はありません。
試しにphp quickstart.phpと再度実行するとすぐにメールのラベル一覧が表示されます。

6. メール一覧を取得する

quickstart.php
// さっき認証に使用した quickstart.php に追記します。

// 検索条件を追加することができます。
$optParams = array(
    'maxResults' => '最大取得件数',
    'labelIds'   => 'ラベルのID', // ラベルのidはlistUsersLabels()で取得可能。
    'pageToken'  => 'ページトークン',
    // Gmailのメール検索時の形式で条件を指定できます。
    'q'          => 'from:someuser@example.com after:2018-02-20',
);
// 条件に当てはまるメールの一覧を取得します。
$messages = $service->users_messages->listUsersMessages($user, $optParams);

// メッセージIDからメールの内容を取得します。
foreach($messages->getMessages as $message) {
    $message_id = $message->getID();
    $message_contents = $service->users_messages->get($user, $message_id);
    print_r($message_contents);
}

7.メモ

メールの本文は上記のコードだと $message_contents['payload']['body']['data']にありますが、URLセーフ処理がかけられているためデコードする必要があります。

$body = $message_contents['payload']['body']['data'];
$body = str_replace(array('-', '_'), array('+', '/'), $body);
$body = base64_decode($body);

でデコードできます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

無限ループ∞最短選手権

さぁみんな無限ループしよう。

最近、無限ループが流行りらしいので
各プログラミング言語(その辺にあった10個の言語)の
無限ループを比べてみます。
果たしてどの言語が1位に輝くのか!?

※改行は1文字としてカウント。
(一応、全て実行してチェックしています)

C (24文字)

int main(void){for(;;);}

C⋕ (37文字)

class a{static void Main(){for(;;);}}

C++ (20文字)

int main(){for(;;);}

D (22文字)

void main(){for(;;){}}

Go (31文字)

package main
func main(){for{}}

Java (54文字)

class a{public static void main(String[] a){for(;;);}}

JavaScript (8文字)

for(;;);

PHP (14文字)

<?php
for(;;);

Python (9文字)

while 1:0

Ruby (11文字)

while 1
end

【優勝】JavaScript

チャンピオンは"JavaScript"でした。さすが"JS"
"JavaScript"は無限ループ界において最有力候補であると考えられますね。

???「JSが優勝だと思っていたのか。」

【真の優勝】Ruby ※追記

Ruby(6文字)
loop{}

Ruby、6文字で無限ループが出来るとは……。
恐るびー

最後に

もっと文字数減らせるよ!とか
もっと文字数が少ない言語あるぜ!最強だぜ!

などなどありましたらコメントまたは編集リクエストでお願い致します。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

?‍♀️無限ループ∞最短選手権?‍♂️

さぁみんな無限ループしよう。

最近、無限ループが流行りらしいので
各プログラミング言語(その辺にあった10個の言語)の
無限ループを比べてみます。
果たしてどの言語が1位に輝くのか!?

※改行は1文字としてカウント。
(一応、全て実行してチェックしています)

C (24文字)

int main(void){for(;;);}

C⋕ (37文字)

class a{static void Main(){for(;;);}}

C++ (20文字)

int main(){for(;;);}

D (22文字)

void main(){for(;;){}}

Go (31文字)

package main
func main(){for{}}

Java (53文字)

class a{public static void main(String[]a){for(;;);}}

JavaScript (8文字)

for(;;);

PHP (14文字)

<?php
for(;;);

Python (9文字)

while 1:0

Ruby (11文字)

while 1
end

【優勝】JavaScript

チャンピオンは"JavaScript"でした。さすが"JS"
"JavaScript"は無限ループ界において最有力候補であると考えられますね。

???「JSが優勝だと思っていたのか。」

【真の優勝】Ruby ※追記

Ruby(6文字)
loop{}

Ruby、6文字で無限ループが出来るとは……。
恐るびー

???「6文字ごときが優勝だと思っていたのか。」

【本当の真の優勝】L00P ※追記(番外編)

L00P(0文字)

0文字……圧巻です。
言語名からして、無限ループ界の頂点に君臨していると思われる風貌をしてますね……。

このように上記で比べていた10個の言語以外の言語では、もっと文字数が少ないものがありました。
無限ループは奥が深い。

最後に

もっと文字数減らせるよ!とか
もっと文字数が少ない言語あるぜ!最強だぜ!

などなどありましたらコメントまたは編集リクエストでお願い致します。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む