چِغِر بَد بَدن: بی‌دقتی در کدنویسی که باعث شد خیلی به در و دیوار بخورم!

چِغِر بَد بَدن: بی‌دقتی در کدنویسی که باعث شد خیلی به در و دیوار بخورم!

داشتم کد می‌زدم که در کمال ناباوری اون خروجی که مد نظرم بود رو به دست نمی‌یاوردم!

بلایی که تابع ()sort در زبان PHP سرم آورد!
اول کدی که نوشتم رو باهم ببینیم (نام‌ها و مقادیر فِیک هستن):

<?php

function pseudoMethod() {
    $resultset = [
        'status' => null,
        'msg' => null,
        'content' => null,
    ];

    $content = [2, 5, 1];

    if ($content) {
        $resultset = [
            'status' => 200,
            'msg' => 'OK',
            'content' => $content,
        ];
    } else {
        $resultset = [
            'status' => 403,
            'msg' => 'Forbidden',
            'content' => 'you`re not allowed',
        ];

    }

    echo json_encode($resultset);
    die();
}

pseudoMethod();

خب همان‌طور که مشخص هست، یک فانکشن داریم به اسم ()pseudoMethod که اگر خلاصه بخوام بگم، یک جیسون رو برمی‌گردونه تا در سمت ویو ازش استفاده کنیم. به عنوان خروجی اسکریپت فوق داریم:

{
    "status": 200, "msg": "OK", "content": [2, 5, 1]
}

تا اینجا همه چیز درست هست اما دوست داشتم در سمت ویو همه‌چیز به‌ترتیب باشه و خیر سرم خواستم تا مقدار کلید content رو سُورت کنم؛ لذا خط یازدهم رو به کد فوق اضافه کردم:

<?php

function pseudoMethod() {
    $resultset = [
        'status' => null,
        'msg' => null,
        'content' => null,
    ];

    $content = [2, 5, 1];
	$content = sort($content);

    if ($content) {
        $resultset = [
            'status' => 200,
            'msg' => 'OK',
            'content' => $content,
        ];
    } else {
        $resultset = [
            'status' => 403,
            'msg' => 'Forbidden',
            'content' => 'you`re not allowed',
        ];

    }

    echo json_encode($resultset);
    die();
}

pseudoMethod();

اما دیگه کد رو تست نکردم و رفتم سراغ کار دیگه‌ای چون می‌دونستم به قول معروف، مو لای درز کدم نمی‌ره (قبل از خوندن ادامهٔ پست، حدس بزنید مشکل کجاست؟)

بعداً که دوباره دست به کد شدم، هِی در ویو می‌دیدم که مقدار کلید content شده true:

{
    "status": 200, "msg": "OK", "content": true
}

به هر چیزی شک کردم به جز خودم (حتی زبان PHP رو هم چند لحظه‌ای زیر سؤال بردم!) تا در نهایت فهمیدم مشکل از کجاست!

در واقع،‌ خروجی تابع ()sort و دیگر توابع از این دست یا TRUE است و یا FALSE و این در حالی است که من مقدار متغیر content$ رو برابر با مقداری که تابع ()sort برمی‌گردوند قرار داده بودم و کد هم به درستی مقدار TRUE رو به متغیر content$ اختصاص می‌داد!!! کد درست این شکلی است:

<?php

function pseudoMethod() {
    $resultset = [
        'status' => null,
        'msg' => null,
        'content' => null,
    ];

    $content = [2, 5, 1];
	sort($content);

    if ($content) {
        $resultset = [
            'status' => 200,
            'msg' => 'OK',
            'content' => $content,
        ];
    } else {
        $resultset = [
            'status' => 403,
            'msg' => 'Forbidden',
            'content' => 'you`re not allowed',
        ];

    }

    echo json_encode($resultset);
    die();
}

pseudoMethod();

به عبارت دیگه، همون‌طور که در خط یازده می‌بینید، فقط باید تابع ()sort فراخوانی شده و پارامتر ورودی (متغیر content$) رو بهش پاس می‌دادم والسلام که خروجی شد:

{
    "status": 200, "msg": "OK", "content": [1, 2, 5]
}

گرچه این بی‌دقتی خیلی ناشیانه و مبتدیانه بود که حتی ذکرش کردنش هم اعتبار کدنویسی آدم رو زیر سؤال می‌بره، اما گفتم اشتراک‌گذاریش خالی از لطف نیست! 

آیا تاکنون بی‌دقتی‌هایی از این دست مرتکب شده‌اید؟

از بهترین نوشته‌های کاربران سکان آکادمی در سکان پلاس


online-support-icon