Help us understand the problem. What is going on with this article?

【PHP】名前つき引数が使えないPHPでも 上手にスカラー値な引数を扱いたい!

More than 1 year has passed since last update.

▼ はじめに

    private function upload() {
        try {
            $this->model
                    ->upload_text_file()
                    ->import_uploaded();
            /* 中略 */
    }

    private function import(array $posted_data) {
        try {
            $this->model
                    ->save_format($posted_data)
                    ->import_uploaded(TRUE)
            /* 中略 */
    }

ぱっと上のコードをみたとき、

->import_uploaded();
->import_uploaded(TRUE)

これらはいったい何の差があるのか全然わからない。
で、関数の定義を確認してみると以下のように書いてあった。

    public function import_uploaded(/* boolean */ $need_to_import_all_rows = FALSE) {
            /* 中略 */
    }

どうやら upload()import_uploaded() だと一部の行を、
import()import_uploaded(TRUE) だと全部の行を読み出したいらしい。

▼ 名前つき引数が使えたら

すでに却下されている名前つき引数が使えたら、以下のように書けたかもしれない。

    private function upload() {
        try {
            $this->model
                    ->upload_text_file()
                    ->import_uploaded();
            /* 中略 */
    }

    private function import(array $posted_data) {
        try {
            $this->model
                    ->save_format($posted_data)
                    ->import_uploaded(need_to_import_all_rows => TRUE)
            /* 中略 */
    }

でも書けないものは仕方ない。
ちなみに名前付き引数 (named parameters, named arguments) は、
キーワード引数 (keyword parameters, keyword arguments) とか読んだりすることもあるらしい。

▼ じゃあどうしよう

@ngyukiさんのPHP でコンストラクタやメソッドを名前付き引数っぽく呼べるようにするトレイト
@mpywさんのPHPで名前付き引数の部分適用を実現するを使ってみたいけど、やんごとなき事情で使えないこともある。

● コメントを書くようにしてみる

    private function upload() {
        try {
            $this->model
                    ->upload_text_file()
                    ->import_uploaded();
            /* 中略 */
    }

    private function import(array $posted_data) {
        try {
            $this->model
                    ->save_format($posted_data)
                    ->import_uploaded(/* need_to_import_all_rows */ TRUE)
            /* 中略 */
    }

● 定数を大盤振る舞いしてみる

    define('IMPORT_ALL_ROWS', TRUE);
    private function upload() {
        try {
            $this->model
                    ->upload_text_file()
                    ->import_uploaded();
            /* 中略 */
    }

    private function import(array $posted_data) {
        try {
            $this->model
                    ->save_format($posted_data)
                    ->import_uploaded(IMPORT_ALL_ROWS)
            /* 中略 */
    }

※もうすこし規模がおおきいときのおはなしは下記をどうぞ
【PHP】EffectiveJava式 Builderパターン っぽいのを使うに至るまで

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした