SlideShare uma empresa Scribd logo
1 de 25
Baixar para ler offline
@DQNEO(どきゅねお) at Mercari
2018.06 #phpstudy
self in
Return Type Declaration
Git本の監修しました
Return type declaration
(戻り値の型宣言)
使ってますか?
function foo(): int
{
}
戻り値の型宣言とは?
こんなやつ
例:自分を返すメソッド
class A
{
public function getMe(): A
{
return $this;
}
}
実はselfと書ける
class A
{
public function getMe(): self
{
return $this;
}
}
べんり!!
意外と知らない人
多い印象
公式ドキュメントには
なぜかselfについて
言及なし
http://php.net/manual/en/functions.returning-
values.php#functions.returning-values.type-declaration
RFCの下の方に小さ∼く
書いてある
https://wiki.php.net/rfc/return_types
継承するとどうなる?
class A
{
public function getMe(): self
{
return $this;
}
}
class B extends A {}
$b = new B();
$b->getMe(); // ?
正解 : Bのインスタンスが返る
class A
{
public function getMe(): self
{
return $this;
}
}
class B extends A {}
$b = new B();
$b->getMe(); // instance of B
$thisは、Bのコンテキス
トから呼ばれるとBのイ
ンスタンスを指すので。
左のコードは右のコードと等価
class A
{
public function getMe(): A
{
return $this;
}
}
class B extends A {}
$b = new B();
$b->getMe(); // B
class A
{
public function getMe(): self
{
return $this;
}
}
class B extends A {}
$b = new B();
$b->getMe(); // B
戻り値の型は、
実行時にreturnされた際に
instanceof(的なもので)
でチェックされる
この場合どうなる?
class A
{
public function getMe(): self
{
return $this;
}
}
class B extends A
{
public function getMe(): self
{
return $this;
}
}
Fatal error

(実行時コンパイルエラー)
PHP Fatal error:
Declaration of B::getMe(): B must be compatible with
A::getMe(): A
これがダメなのと同じ

(シグネチャの不一致)
class A
{
public function getMe(): A
…
}
class B extends A
{
public function getMe(): B
…
}
こうすればおk
class A
{
public function getMe(): self
{
return $this;
}
}
class B extends A
{
public function getMe(): parent
{
return $this;
}
}
これがOKなのと同じ
class A
{
public function getMe(): A
…
}
class B extends A
{
public function getMe(): A
…
}
余談:これは将来のPHPでは
可能になるかもしれない。(戻り値の共変)
class A
{
public function getMe(): A
}
class B extends A
{
public function getMe(): B
…
}
https://wiki.php.net/rfc/covariant-returns-and-
contravariant-parameters
ちなみに型名のところに
staticは不可。
class A
{
public function getMe(): static
…
}
まとめ
• 戻り値型宣言でself, parent
が使える
• 乱用するとわかりにくくなる
ので適材適所で
• 「instanceofチェック」だと
思えばおk
余談:メソッドの引数でも使える
class A
{
public function setMe(self $self)
{
$this->self = $self;
}
}
class B extends A
{
public function setMe(parent $self)
{
$this->self = $self;
}
}
ご清聴ありがとう
ございました
mm

Mais conteúdo relacionado

Mais procurados

amCharts勉強会
amCharts勉強会amCharts勉強会
amCharts勉強会Naoki Iwami
 
Windowsフォームで大丈夫か?一番良いのを頼む。
Windowsフォームで大丈夫か?一番良いのを頼む。Windowsフォームで大丈夫か?一番良いのを頼む。
Windowsフォームで大丈夫か?一番良いのを頼む。Yuya Yamaki
 
【Unite 2017 Tokyo】もっと気軽に、動的なコンテンツ配信を ~アセットバンドルの未来と開発ロードマップ
【Unite 2017 Tokyo】もっと気軽に、動的なコンテンツ配信を ~アセットバンドルの未来と開発ロードマップ【Unite 2017 Tokyo】もっと気軽に、動的なコンテンツ配信を ~アセットバンドルの未来と開発ロードマップ
【Unite 2017 Tokyo】もっと気軽に、動的なコンテンツ配信を ~アセットバンドルの未来と開発ロードマップUnite2017Tokyo
 
ADRという考えを取り入れてみて
ADRという考えを取り入れてみてADRという考えを取り入れてみて
ADRという考えを取り入れてみてinfinite_loop
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―shinjiigarashi
 
アプリ屋もDockerをドカドカ使おう ~ Docker入門
アプリ屋もDockerをドカドカ使おう ~ Docker入門アプリ屋もDockerをドカドカ使おう ~ Docker入門
アプリ屋もDockerをドカドカ使おう ~ Docker入門Hori Tasuku
 
Redmineって何ができるの?
Redmineって何ができるの?Redmineって何ができるの?
Redmineって何ができるの?Tomohisa Kusukawa
 
serviceクラスをやめようサブクラスを使おう
serviceクラスをやめようサブクラスを使おうserviceクラスをやめようサブクラスを使おう
serviceクラスをやめようサブクラスを使おうよしだ あつし
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring増田 亨
 
Writing Spring WebFlux more esay with kotlin
Writing Spring WebFlux more esay with kotlinWriting Spring WebFlux more esay with kotlin
Writing Spring WebFlux more esay with kotlin賢太郎 前多
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説増田 亨
 
Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかLaravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかShohei Okada
 
社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPIAkihiro Ikezoe
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ増田 亨
 
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方増田 亨
 
「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう増田 亨
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門torisoup
 
Datadog Agent on CloudRunによるGCPトレービリティ向上
Datadog Agent on CloudRunによるGCPトレービリティ向上Datadog Agent on CloudRunによるGCPトレービリティ向上
Datadog Agent on CloudRunによるGCPトレービリティ向上Ryo Sasaki
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~infinite_loop
 
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ...
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 (  Redmine of one plant 2022 ...ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 (  Redmine of one plant 2022 ...
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ...Kohei Nakamura
 

Mais procurados (20)

amCharts勉強会
amCharts勉強会amCharts勉強会
amCharts勉強会
 
Windowsフォームで大丈夫か?一番良いのを頼む。
Windowsフォームで大丈夫か?一番良いのを頼む。Windowsフォームで大丈夫か?一番良いのを頼む。
Windowsフォームで大丈夫か?一番良いのを頼む。
 
【Unite 2017 Tokyo】もっと気軽に、動的なコンテンツ配信を ~アセットバンドルの未来と開発ロードマップ
【Unite 2017 Tokyo】もっと気軽に、動的なコンテンツ配信を ~アセットバンドルの未来と開発ロードマップ【Unite 2017 Tokyo】もっと気軽に、動的なコンテンツ配信を ~アセットバンドルの未来と開発ロードマップ
【Unite 2017 Tokyo】もっと気軽に、動的なコンテンツ配信を ~アセットバンドルの未来と開発ロードマップ
 
ADRという考えを取り入れてみて
ADRという考えを取り入れてみてADRという考えを取り入れてみて
ADRという考えを取り入れてみて
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
 
アプリ屋もDockerをドカドカ使おう ~ Docker入門
アプリ屋もDockerをドカドカ使おう ~ Docker入門アプリ屋もDockerをドカドカ使おう ~ Docker入門
アプリ屋もDockerをドカドカ使おう ~ Docker入門
 
Redmineって何ができるの?
Redmineって何ができるの?Redmineって何ができるの?
Redmineって何ができるの?
 
serviceクラスをやめようサブクラスを使おう
serviceクラスをやめようサブクラスを使おうserviceクラスをやめようサブクラスを使おう
serviceクラスをやめようサブクラスを使おう
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
 
Writing Spring WebFlux more esay with kotlin
Writing Spring WebFlux more esay with kotlinWriting Spring WebFlux more esay with kotlin
Writing Spring WebFlux more esay with kotlin
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
 
Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかLaravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのか
 
社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
 
「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門
 
Datadog Agent on CloudRunによるGCPトレービリティ向上
Datadog Agent on CloudRunによるGCPトレービリティ向上Datadog Agent on CloudRunによるGCPトレービリティ向上
Datadog Agent on CloudRunによるGCPトレービリティ向上
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
 
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ...
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 (  Redmine of one plant 2022 ...ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 (  Redmine of one plant 2022 ...
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ...
 

Semelhante a PHPの戻り値型宣言でselfを使ってみよう

GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)lestrrat
 
はじめての FuelPHP
はじめての FuelPHPはじめての FuelPHP
はじめての FuelPHPSho A
 
Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12Keisuke Fukuda
 
Web技術勉強会 20100925
Web技術勉強会 20100925Web技術勉強会 20100925
Web技術勉強会 20100925龍一 田中
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門bleis tift
 
symfony 1.2を支えるサブフレームワーク
symfony 1.2を支えるサブフレームワークsymfony 1.2を支えるサブフレームワーク
symfony 1.2を支えるサブフレームワークKatsuhiro Ogawa
 
WordPressで投稿記事情報の取得方法
WordPressで投稿記事情報の取得方法WordPressで投稿記事情報の取得方法
WordPressで投稿記事情報の取得方法regret raym
 
Hack/HHVM 入門
Hack/HHVM 入門Hack/HHVM 入門
Hack/HHVM 入門y-uti
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarSotaro Karasawa
 
Best practice laravel
Best practice laravelBest practice laravel
Best practice laravelRisa Ohnishi
 

Semelhante a PHPの戻り値型宣言でselfを使ってみよう (10)

GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
 
はじめての FuelPHP
はじめての FuelPHPはじめての FuelPHP
はじめての FuelPHP
 
Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12
 
Web技術勉強会 20100925
Web技術勉強会 20100925Web技術勉強会 20100925
Web技術勉強会 20100925
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門
 
symfony 1.2を支えるサブフレームワーク
symfony 1.2を支えるサブフレームワークsymfony 1.2を支えるサブフレームワーク
symfony 1.2を支えるサブフレームワーク
 
WordPressで投稿記事情報の取得方法
WordPressで投稿記事情報の取得方法WordPressで投稿記事情報の取得方法
WordPressで投稿記事情報の取得方法
 
Hack/HHVM 入門
Hack/HHVM 入門Hack/HHVM 入門
Hack/HHVM 入門
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI Seminar
 
Best practice laravel
Best practice laravelBest practice laravel
Best practice laravel
 

Mais de DQNEO

Git tips by symbols
Git tips by symbolsGit tips by symbols
Git tips by symbolsDQNEO
 
Introduction to Guzzle
Introduction to GuzzleIntroduction to Guzzle
Introduction to GuzzleDQNEO
 
install PHP7 on CentOS7 by Ansible
install PHP7 on CentOS7 by Ansibleinstall PHP7 on CentOS7 by Ansible
install PHP7 on CentOS7 by AnsibleDQNEO
 
Dependency Injection and Pimple
Dependency Injection and PimpleDependency Injection and Pimple
Dependency Injection and PimpleDQNEO
 
Gitのつくりかた YAPC::Asia 2015 @DQNEO
Gitのつくりかた YAPC::Asia 2015 @DQNEOGitのつくりかた YAPC::Asia 2015 @DQNEO
Gitのつくりかた YAPC::Asia 2015 @DQNEODQNEO
 
plenv時代のImageMagick && Image::Magickインストール方法
plenv時代のImageMagick && Image::Magickインストール方法plenv時代のImageMagick && Image::Magickインストール方法
plenv時代のImageMagick && Image::Magickインストール方法DQNEO
 
やさしいGitの内部構造 - yapcasia2013
やさしいGitの内部構造 - yapcasia2013やさしいGitの内部構造 - yapcasia2013
やさしいGitの内部構造 - yapcasia2013DQNEO
 
Gitの内部構造を 調べてみたら・・・
Gitの内部構造を 調べてみたら・・・Gitの内部構造を 調べてみたら・・・
Gitの内部構造を 調べてみたら・・・DQNEO
 
桐島、ファイルに 保存するの やめるってよ
桐島、ファイルに 保存するの やめるってよ 桐島、ファイルに 保存するの やめるってよ
桐島、ファイルに 保存するの やめるってよ DQNEO
 

Mais de DQNEO (9)

Git tips by symbols
Git tips by symbolsGit tips by symbols
Git tips by symbols
 
Introduction to Guzzle
Introduction to GuzzleIntroduction to Guzzle
Introduction to Guzzle
 
install PHP7 on CentOS7 by Ansible
install PHP7 on CentOS7 by Ansibleinstall PHP7 on CentOS7 by Ansible
install PHP7 on CentOS7 by Ansible
 
Dependency Injection and Pimple
Dependency Injection and PimpleDependency Injection and Pimple
Dependency Injection and Pimple
 
Gitのつくりかた YAPC::Asia 2015 @DQNEO
Gitのつくりかた YAPC::Asia 2015 @DQNEOGitのつくりかた YAPC::Asia 2015 @DQNEO
Gitのつくりかた YAPC::Asia 2015 @DQNEO
 
plenv時代のImageMagick && Image::Magickインストール方法
plenv時代のImageMagick && Image::Magickインストール方法plenv時代のImageMagick && Image::Magickインストール方法
plenv時代のImageMagick && Image::Magickインストール方法
 
やさしいGitの内部構造 - yapcasia2013
やさしいGitの内部構造 - yapcasia2013やさしいGitの内部構造 - yapcasia2013
やさしいGitの内部構造 - yapcasia2013
 
Gitの内部構造を 調べてみたら・・・
Gitの内部構造を 調べてみたら・・・Gitの内部構造を 調べてみたら・・・
Gitの内部構造を 調べてみたら・・・
 
桐島、ファイルに 保存するの やめるってよ
桐島、ファイルに 保存するの やめるってよ 桐島、ファイルに 保存するの やめるってよ
桐島、ファイルに 保存するの やめるってよ
 

PHPの戻り値型宣言でselfを使ってみよう