سؤال

أنا متأكد من الجواب على هذا السؤال هو لا ، ولكن في حال كان هناك بعض PHP المعلم

هل من الممكن كتابة وظيفة بطريقة غير صالح الحجج أو غير موجودة المتغيرات يمكن أن تنتقل في php لا خطأ دون استخدام '@'

مثل فارغة و isset القيام به.يمكنك تمرير في متغير فقط تتكون ولن خطأ.

ex:

empty($someBogusVar); // no error

myHappyFunction($someBogusVar); // Php warning / notice
هل كانت مفيدة؟

المحلول

تلخيص الجواب الصحيح هو لا, لا يجب (انظر التحذير أدناه).

هناك الحلول التي سبق ذكرها من قبل العديد من الناس في هذا الموضوع ، مثل استخدام المتغيرات المرجعية أو isset() أو فارغة() في ظروف قمع الإشعارات في التكوين PHP.هذا بالإضافة إلى وضوحا الحل باستخدام @, التي كنت لا تريد.

يلخص مثيرة للاهتمام تعليق المناقشة مع جيري:تمرير متغير من قبل المرجعية هو في الواقع صالحة إذا كنت تحقق من قيمة المتغير داخل الدالة والتعامل مع غير معروف أو null الحالات بشكل صحيح.فقط لا تستخدم إشارة عابرة كوسيلة اغلاق PHP (هذا هو بلدي حيث الأصل لا ينبغي نقاط).

نصائح أخرى

كنت لا تحصل على أي خطأ عندما متغير مرت الإشارة (PHP سيتم إنشاء متغير جديد بصمت):

 function myHappyFunction(&$var)
 {       
 }

ولكن أوصي ضد استغلال هذا لإخفاء أخطاء البرمجة.

يمكنك القيام بذلك باستخدام func_get_args مثل ذلك:

error_reporting(E_ALL);
ini_set('display_errors', 1);

function defaultValue() {
    $args = func_get_args();

    foreach($args as $arg) {
        if (!is_array($arg)) {
            $arg = array($arg);
        }
        foreach($arg as $a) {
            if(!empty($a)) {
                return $a;
            }
        }
    }

    return false;
}

$var = 'bob';

echo defaultValue(compact('var'), 'alpha') . "\n"; //returns 'bob'
echo defaultValue(compact('var2'), 'alpha') . "\n"; //returns 'alpha'
echo defaultValue('alpha') . "\n"; //return
echo defaultValue() . "\n";

هذا ظائفها يذهب خطوة أبعد من شأنها أن تعطيك الأولى غير قيمة فارغة من أي عدد من وسائط (يمكنك دائما إلى تأخذ فقط ما يصل الى اثنين من وسائط ولكن هذه تبدو أكثر فائدة لي مثل هذا).

تحرير:النسخة الأصلية لم تستخدم المدمجة في محاولة لجعل مجموعة من وسائط و لا يزال أعطى خطأ.تقرير عن الخطأ صدم قليلا و هذا الإصدار الجديد مع ضغط أقل مرتبة ، ولكن لا يزال يفعل نفس الشيء و يسمح لك لتوفير قيمة افتراضية غير موجودة فأر.

هناك صالح الحالات التي يكون فيها فحص تصبح مرهقة و unnessesary.
لذلك كتبت هذا السحر قليلا الوظيفة:

/**
 * Shortcut for getting a value from a possibly unset variable.
 * Normal:
 *   if (isset($_GET['foo']) && $_GET['foo'] == 'bar') {
 * Short:
 *   if (value($_GET['foo']) == 'bar') {
 *
 * @param mixed  $variable 
 * @return mixed  Returns null if not set
 */
function value(&$variable) {
    if (isset($variable)) {
        return $variable;
    }
}

أنها لا تتطلب أي تغييرات على myHappyFunction().
عليك أن تغير

myHappyFunction($someBogusVar);

إلى

myHappyFunction(value($someBogusVar));

مشيرا إلى القصد الخاص صراحة.مما يجعل الممارسة الجيدة في كتابي.

لا, لأن هذا ليس حقا أي شيء للقيام مع وظيفة ؛ الخطأ يأتي من محاولة إلغاء مرجعية غير موجودة مجموعة رئيسية.يمكنك تغيير مستوى التحذير من PHP الخاص بك الإعداد surpress هذه الأخطاء, ولكن من الافضل ان لا تفعل هذا.

أما وقد قلت ذلك ، يمكن أن لا شيء مثل

function safeLookup($array, $key)
{
  if (isset($array, $key))
    return $array[$key];

  return 0;
}

واستخدامه في مكان مجموعة الرئيسية في البحث

defaultValue(safeLookup($foo, "bar"), "baz);

الآن أنا بحاجة إلى الاستحمام :)

هل من الممكن كتابة وظيفة بطريقة غير صالح الحجج أو غير موجودة المتغيرات يمكن أن تنتقل في php لا خطأ دون استخدام '@'

نعم يمكنك!

porneL هو الصحيح [عدل:ليس لدي ما يكفي من النقاط إلى رابط جوابه أو التصويت عليه ، لكنه في هذه الصفحة]

وهو أيضا صحيح عندما يحذر "ولكن أوصي ضد استغلال هذا لإخفاء أخطاء البرمجة". ومع ذلك قمع الخطأ عن طريق الخطأ مراقبة المشغل (@) وينبغي أيضا تجنب لهذا السبب نفسه.

أنا جديدة إلى تجاوز سعة مكدس ، ولكن آمل أنه ليس من الشائع إجابة غير صحيحة ليكون في المرتبة الأعلى على صفحة بينما الإجابة الصحيحة يحصل على أية أصوات.:(

@براين:يمكنني استخدام trinary العملية للقيام تحقق بالنسبة لي:

return $value ? $value : $default;

وهذا يعود إما قيمة $أو $الافتراضي.اعتمادا على قيمتها قيمة.إذا كان 0, false, فارغة أو أي شيء مماثل القيمة في $الافتراضية التي سيتم إرجاعها.

أنا ذاهب التحدي لمحاكاة وظائف مثل فارغة() و isset()

@شون الذي كان بالفعل أجاب براين

return isset($input) ? $input : $default;

شون, هل يمكن أن تفعل:

$result = ($func_result = doLargeIntenseFunction()) ? $func_result : 'no result';

تحرير:

أنا متأكد من أن هناك مجموعة كبيرة مناقشة الثلاثي مشغلي vrs وظيفة المكالمات.ولكن من هذه النقطة السؤال لمعرفة ما إذا كان يمكننا إنشاء وظيفة هذا لن رمي خطأ إذا غير موجودة القيمة التي يتم تمريرها في دون استخدام '@'

و قلت لك التحقق من ذلك مع isset().الثلاثي الشرطي الأول جزء لا تحقق باطل أو غير باطل ، فإنه يتحقق true أو false.إذا كنت في محاولة للتحقق true أو false على قيمة فارغة في PHP, يمكنك الحصول على هذه التحذيرات. isset() التحقق من ما إذا كان متغير أو تعبير بإرجاع قيمة فارغة أو لا تقوم بإرجاع قيمة منطقية التي يمكن تقييمها من قبل الجزء الأول من الثلاثي دون أي أخطاء.

أنا متأكد من أن هناك مناقشة كبيرة على الثلاثي مشغلي vrs المكالمات وظيفة.ولكن الهدف من هذا السؤال هو معرفة ما اذا كنا نستطيع إنشاء دالة لن رمي خطأ إذا كانت غير موجودة القيمة مرت دون استخدام '@'

في حين أن الإجابة على السؤال الأصلي هو "لا" ، هناك خيارات لا أحد قد ذكر.

عند استخدام علامة @ كل PHP تقوم به هو تجاوز error_reporting مستوى مؤقتا تعيين إلى صفر.يمكنك استخدام "ini_restore('error_reporting');"تعيين مرة أخرى إلى ما كان عليه قبل @ تم استخدامها.

هذا مفيد لي في حالة أردت أن أكتب الراحة وظيفة تحقق لمعرفة إذا كان المتغير تم تعيين و بعض الخصائص الأخرى كذلك, وإلا إرجاع القيمة الافتراضية.ولكن إرسال رسالة إلغاء تعيين متغير من خلال تسببت PHP إشعار ، لذا استخدمت @ لقمع هذا ولكن مجموعة error_reporting العودة إلى القيمة الأصلية داخل الدالة.

شيء من هذا القبيل:

$var = @foo($bar);

function foo($test_var)
{
     ini_restore('error_reporting');

     if(is_set($test_var) && strlen($test_var))
     {
          return $test_var;
     }
     else
     {
          return -1;
     }
}

حتى في الحالة المذكورة أعلاه ، إذا $bar لم يتم تعيين لن تحصل على خطأ عندما اتصل foo() مع عدم وجود متغير.ومع ذلك ، سوف تحصل على خطأ من خلال وظيفة حيث كنت كتبته خطأ is_set بدلا من isset.

هذا يمكن أن يكون خيارا مفيدا تغطي ما الأصلية السؤال كان يسأل في الروح ، إن لم يكن في الواقع الفعلي.

إذا كان يمكنك ببساطة إضافة قيمة افتراضية للمعلمة ، يمكنك تخطي ذلك عند استدعاء الدالة.على سبيل المثال:

function empty($paramName = ""){
    if(isset($paramName){
        //Code here
    }
    else if(empty($paramName)){
        //Code here
    }
}

مع خط واحد ، يمكنك acomplish ذلك: myHappyFunction($someBogusVar="");

آمل أن يكون هذا هو ما كنت أبحث عنه.إذا كنت تقرأ php الوثائق تحت الافتراضي حجة القيم, يمكنك أن ترى أن تعيين القيمة الافتراضية إلى وظيفة حجة يساعدك على منع رسالة خطأ عند استخدام وظائف.

في هذا المثال يمكنك أن ترى الفرق من استخدام الافتراضي الحجة وانها المزايا:

كود PHP:

<?php
function test1($argument)
{
    echo $argument;
    echo "\n";
}

function test2($argument="")
{
    echo $argument;
    echo "\n";
}

test1();
test1("Hello");
test1($argument);
$argument = "Hello world";
test1($argument);

test2();
test2("Hello");
test2($argument);
$argument = "Hello world";
test2($argument);
?>

إخراج test1() خطوط:

تحذير:في عداد المفقودين الحجة 1 test1() .
مرحبا.
.
مرحبا العالم.

إخراج test2() خطوط:

.
مرحبا.

مرحبا العالم.

هذا ويمكن أيضا أن تستخدم في تركيبة isset() وغيرها من المهام لإنجاز ما تريد.

والذهاب أبعد التجريد شجرة ، ماذا تستخدم هذا ؟

يمكنك إما تهيئة تلك القيم في كل فئة حسب الاقتضاء أو إنشاء فئة معينة تحتوي على جميع القيم الافتراضية والصفات مثل:

class Configuration {

    private var $configValues = array( 'cool' => 'Defaultcoolval' ,
                                       'uncool' => 'Defuncoolval'  );

    public setCool($val) {
        $this->configValues['cool'] = $val;
    }

    public getCool() {
        return $this->configValues['cool'];
    }

}

والفكرة هي أنه عند استخدام defaultValue وظيفة في كل مكان في التعليمات البرمجية الخاصة بك, وسوف تصبح صيانة كابوس كلما كان لديك لتغيير قيمة ، وتبحث عن كل الأماكن التي كنت قد وضعت defaultValue الاتصال.وأنها سوف أيضا ربما يؤدي إلى تكرار نفسك ، منتهكة الجافة.

في حين أن هذا هو مكان واحد لتخزين كل تلك القيم الافتراضية.كنت قد تميل إلى تجنب خلق تلك المحددات و حاصل ، ولكنها تساعد أيضا في الصيانة في حال becomse ذات الصلة إلى القيام ببعض التعديل النواتج أو التحقق من صحة المدخلات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top