[php] विशेषता फ़ंक्शन को ओवरराइड कैसे करें और इसे ओवरराइड फ़ंक्शन से कॉल करें?


Answers

यदि वर्ग सीधे विधि लागू करता है, तो यह गुण संस्करण का उपयोग नहीं करेगा। शायद आप क्या सोच रहे हैं:

trait A {
    function calc($v) {
        return $v+1;
    }
}

class MyClass {
    function calc($v) {
        return $v+2;
    }
}

class MyChildClass extends MyClass{
}

class MyTraitChildClass extends MyClass{
    use A;
}

print (new MyChildClass())->calc(2); // will print 4

print (new MyTraitChildClass())->calc(2); // will print 3

चूंकि बाल वर्ग सीधे विधि को लागू नहीं करते हैं, इसलिए वे पहले विशेषता के उस उपयोग का उपयोग करेंगे यदि अन्यथा माता-पिता वर्ग का उपयोग किया जाता है।

यदि आप चाहते हैं, तो विशेषता अभिभावक वर्ग में विधि का उपयोग कर सकती है (माना जाता है कि आपको पता है कि विधि वहां होगी) उदाहरण के लिए

trait A {
    function calc($v) {
        return parent::calc($v*3);
    }
}
// .... other code from above
print (new MyTraitChildClass())->calc(2); // will print 8 (2*3 + 2)

आप ओवरराइड करने के तरीकों के लिए भी उपलब्ध करा सकते हैं, लेकिन फिर भी निम्नानुसार विधि विधि तक पहुंच सकते हैं:

trait A {
    function trait_calc($v) {
        return $v*3;
    }
}

class MyClass {
    function calc($v) {
        return $v+2;
    }
}


class MyTraitChildClass extends MyClass{
    use A {
      A::trait_calc as calc;
    }
}


class MySecondTraitChildClass extends MyClass{
    use A {
      A::trait_calc as calc;
    }

    public function calc($v) {
      return $this->trait_calc($v)+.5;
    }
}


print (new MyTraitChildClass())->calc(2); // will print 6
echo "\n";
print (new MySecondTraitChildClass())->calc(2); // will print 6.5

आप इसे http://sandbox.onlinephpfunctions.com/code/e53f6e8f9834aea5e038aec4766ac7e1c19cc2b5 पर देख सकते हैं

Question

परिदृश्य:

trait A {
    function calc($v) {
        return $v+1;
    }
}

class MyClass {
    use A;

    function calc($v) {
        $v++;
        return A::calc($v);
    }
}

print (new MyClass())->calc(2); // should print 4

यह कोड काम नहीं करता है, और मुझे एक विशेषता समारोह को कॉल करने का कोई तरीका नहीं मिल रहा है जैसे विरासत में मिला था। मैंने self::calc($v) , static::calc($v) , parent::calc($v) , A::calc($v) और निम्न को कॉल करने का प्रयास किया:

trait A {
    function calc($v) {
        return $v+1;
    }
}

class MyClass {
    use A {
        calc as traitcalc;
    }

    function calc($v) {
        $v++;
        return traitcalc($v);
    }
}

कुछ भी काम नहीं करता है।

क्या इसे काम करने का कोई तरीका है या मुझे पूरी तरह से विशेषता समारोह को ओवरराइड करना चाहिए जो इससे कहीं अधिक जटिल है :)




एक और विशेषता का उपयोग करना:

trait ATrait {
    function calc($v) {
        return $v+1;
    }
}

class A {
    use ATrait;
}

trait BTrait {
    function calc($v) {
        $v++;
        return parent::calc($v);
    }
}

class B extends A {
    use BTrait;
}

print (new B())->calc(2); // should print 4



Links



Tags

php php   traits