Funktsiyalarni almashtirish uchun Php statik usullari.

Corisna haqida ma'lumot / Kontaktlar


topshirish
Golovna

Qo'shimcha funksionallik

Dunyoda PHP dasturining ikki turi mavjud.

Ba'zilar statik usullarni hurmat qiladilar, chunki ulardan foydalanish oson, boshqalari esa statik usullarni yomon deb hurmat qiladi va ularni o'z amaliyotida ishlatmaydi.
Ushbu maqoladan men ishlab chiquvchilar eng yaxshi amaliyotlarni e'tiborsiz qoldirishi va statik usullarning butun majmuasini vikorist qilishini tushuntirishga harakat qilaman, vikorystning bir qator ramkalar bilan ishlash dalili.

Statik usullarni kim yaxshi ko'radi?

Ayniqsa, ko'pincha ular CodeIgniter ramkasini o'z ishlaridan foydalangan ishlab chiquvchilar tomonidan to'xtab qolishadi.

Shuningdek, zamonaviy statistik usullar Kohana va Laravel ilovalarining ko'pchiligini o'z ichiga oladi. Bu erda siz kuchli nutqlarni yozishni boshlashi mumkin bo'lgan dasturlar CodeIgniter blogiga asoslangan deb taxmin qilolmaysiz. Nega uxlayapsiz?

CodeIgniter PHP 5 ga statik usullarni qo'shishdan oldin PHP 4 ni qo'llab-quvvatladi. Bundan tashqari, CodeIgniter nazoratchiga tayinlangan barcha sinflarga teng kirish imkonini beruvchi noyob "super ob'ekt" ga ega.

Shu tariqa ular ushbu tizim doirasida ommaga taqdim etiladi.

Bu shuni anglatadiki, sinflarga hukumat so'ragan __get() usuli yordamida istalgan modeldan kirish mumkin.

get_instance()->($var)

.

Ilgari, agar PHP 4 da __get() funktsiyasini qo'llab-quvvatlash mavjud bo'lmasa, buning uchun foreach konstruktsiyasi CI_Controller parametrlari orqali ishlatilgan va keyin ular modeldagi $tush o'zgaruvchisiga tayinlangan.
Kutubxona get_instance tugmasini bosishi kerak.
CodeIgniter dasturchilarining ko'pchiligi uchun biz PHP 5 ning barcha xususiyatlaridan foydalanish uchun Kohana ramkasiga o'tgan eski PHP 4 dan foydalanamiz, unda hech qanday g'ayrioddiy narsa yo'q.

Kamroq belgilar yaxshiroq, to'g'rimi?

Va muammo nimada?

Ko'pgina PHP dasturchilari (ayniqsa Symfony va Zend-ni yaxshi biladiganlar) shunday deyishadi: "Bu aniq - vikorista Vprovadzhennya delezheniya!"

Biroq, CodeIgniter hamkorligida bu jarayon bilan ishlashning haqiqiy dalillariga ega bo'lgan mutaxassislar ko'p emas, garchi buni qilish qiyin.
Fuel PHP ramkasi haqidagi yana bir fakt shundaki, hozirgacha asosan statik usullar interfeys vazifasini bajaradi.
Misol uchun, mantiq hali ham statika bilan bog'liq muammolarni keltirib chiqaradi, ayniqsa HMVC kontseptsiyasi ishtirok etganda. Bu 1.1 versiyasidan boshlab FuelPHP dan vikorizatsiya qilmagan psevdokod: Class ControllerA Controllerni kengaytiradi ( umumiy funktsiya action_foo() ( echo Input::get("param"); ) )

Standart kodni qo'shing.
Ushbu usul qiymatni ko'rsatadi
?bar= usulda. Ushbu usuldan foydalanish uchun HMVC dan foydalansak nima bo'ladi? Class ControllerB Controllerni kengaytiradi ( umumiy funktsiya action_baz() ( echo Input::get("param"); ​​echo " & "; echo Request::forge("controllera/foo?param=val1")->execute() )) Brauzeringizni bosing

controllerb/baz

, siz "val1" ni kiritasiz, keyin siz yozasiz
controllerb/baz?param=override
, keyin bir xil qiymatlarni aylantiradigan usulni o'zgartirish uchun haqoratli tugmalarni olib tashlang.

Muvofiqlik

Global kod sizga kerakli natijani bermaydi.

Dumba har qanday so'z uchun chiroyliroq:

$this->so'rov->input->get("param");

Kirish ob'ekti teri kiritish uchun yangi namunani joylashtirishi mumkin, shuning uchun kirish ob'ekti teri kiritish uchun yaratiladi, u faqat ma'lum bir kirish uchun kirish ma'lumotlarini joylashtiradi.

Input::get("foo") konstruksiyasi fonda mantiqiy misollar uchun fasad yaratadi.

Ammo bu global kodning ishi bilan bog'liq oziq-ovqatga bog'liq emas.

Ko'pgina muolajalar sinovdan o'tkazilganda, yangi ramka o'rnatmasdan ikkita rejim o'rtasida almashishi mumkin.

Mana Teylor Otvellning (yaratuvchi va Laravel 4) ajoyib videosi, unda u statik kodni DiC konteyneringiz orqali tekshiriladigan bitta nusxaga qanday almashtirishingiz mumkinligini tasvirlaydi.

Laravel 4 - Vimeo-da UserScape-dan IoC Controller injection va birlik sinovi.

Bu Laravelda statik usullardan foydalanmasdan qanday qilish mumkinligi haqida ajoyib taqdimot.

Ushbu zamonaviy ramkalar, birinchi qarashda, Kohana kabi ko'rinishi mumkin bo'lsa-da, ular standart sozlamalarga nisbatan butunlay boshqacha.

Ushbu shubhali eslatmada.

Hozir men Laravel-da CodeIgniter-dan PyroCMS-ni qayta ishlash ustida ishlayapman.

Men to'g'ridan-to'g'ri global PHP 4 kodidan omonatlarning to'liq to'plamiga o'tishga harakat qilyapman - bu mutlaqo o'z-o'zini yo'q qilish.

  • CI vikisidan oldingi oʻrta atama PHP 5 viki, bir qancha statik usullarga ega PSR-2 kodi.
  • Ayni paytda, biz hali ham CodeIgniter-da tanilganmiz.
  • Statik koddan DiC kodiga o'tish, agar biz Laravelga to'liq o'tishga qaror qilsak, osongina ko'rsatilishi mumkin.
Yuqori darajada bog'langan CodeIgniter kodidan sinovdan o'tgan PSR-2 ga o'tish bosh og'rig'idir.

Pyro jamoasi allaqachon yaxshi holatda - va bu epik bo'ladi.

Men bu mavzu haqida uzoq vaqtdan beri yozmoqchi edim.

Birinchi qism Miško Xeverining "Statik usullar - sinovdan o'tish uchun o'limdir" maqolasi edi.
Men nashr qilish uchun maqola yozdim, lekin uni hech qachon nashr etmadim.

Va yaqinda biz "Sinfga yo'naltirilgan dasturlash" deb nomlanishi mumkin bo'lgan narsani topdik.

BloomFilter sinfi ( ... umumiy funktsiya __construct($m, $k) ( ... ) umumiy statik funksiya getK($m, $n) ( qaytarish paneli(($m / $n) * log(2))) ) ... )
Ushbu kichik qo'shimcha funktsiya konstruktorda baholanadigan $k argumenti uchun yaxshi raqamni yaratishga yordam beradigan aniq algoritm uchun o'rashni ta'minlaydi.

Chunki
sinfning namunasi yaratilgunga qadar buti viklicana bo'lishi mumkin, buti statik bo'lishi mumkin.

  • Ushbu algoritm hech qanday qo'shimcha funktsiyalarga ega emas va uni almashtirish ehtimoli yo'q.

    Bu shunday yozilgan:
    $m = 10000;

  • $n = 2000;

    $b = yangi BloomFilter($m, BloomFilter::getK($m, $n));

    Bu zarur qo'shimcha depozitlarni yaratmaydi.

    Sinf o'zini yolg'on gapirishi kerak.

    Katlanadigan qo'shimchalarni yaratishda eng samarali yondashuv yashirin bo'lishi mumkin bo'lgan atrofdagi qismlarni yaratishdir.

    Siz o'ylashingiz mumkin bo'lgan qismlar, ular haqida qo'shiq aytishingiz mumkin.
    Misol uchun, agar siz statik Database::fetchAll(...) ni bossangiz, ma'lumotlar bazasi ulanishi allaqachon o'rnatilgan yoki o'rnatilishiga kafolat yo'q.

    Funktsiya (ma'lumotlar bazasi $ma'lumotlar bazasi) ( ... )

    Ushbu funktsiyaning o'rtasida joylashgan kod yoziladi, ya'ni Ma'lumotlar bazasi namunasi muvaffaqiyatli o'tkazildi, ya'ni Ma'lumotlar bazasi ob'ekt namunasi muvaffaqiyatli yaratilgan.

    Agar Database klassi to'g'ri tuzilgan bo'lsa, biz sinf misolining mavjudligi uni ma'lumotlar bazasiga yozish mumkinligini anglatadi deb taxmin qilishimiz mumkin.

    Agar misol tasniflanmagan bo'lsa, funktsiyaning tanasi aniqlanmaydi.

    Bu shuni anglatadiki, funktsiya ma'lumotlar bazasi holatiga xalaqit berishi kerak va Database klassi o'zi yaratilishi kerak.

    Ushbu yondashuv orqada qolgan ishlarni unutib, diqqatni o'z oldingizga qo'ygan vazifaga qaratish imkonini beradi.
    Ushbu konlarni saqlash va saqlash haqida o'ylamaslik qobiliyatisiz har qanday qo'shimcha qo'shimchani yozish deyarli mumkin emas.

    Bu sinf ob'ekt yaratmasdan matematik funktsiyalar bilan ishlash vositalarini taqdim etadi.

    Sinfda $count ning statik quvvatini bir marta oshiruvchi konstruktor mavjud.

    Sinf hokimiyatning ma'nosini unutgan va statik bo'lib qolmoqda.

    Ushbu yondashuv orqada qolgan ishlarni unutib, diqqatni o'z oldingizga qo'ygan vazifaga qaratish imkonini beradi. Nutqdan oldin statik quvvat maqsadida statik soʻz, statik quvvatga kirish uchun esa “self” soʻzi qoʻsh “::” bilan qoʻllaniladi.
    Hamma narsa tekislandi, ayniqsa rahm-shafqat bilan ishlaydigan dumba.
    Keling, dumbamizni biroz kengaytiraylik.
    hisoblagich++;

    ) umumiy statik funksiya calcSin($x) ( qaytaruvchi sin($x); ) umumiy statik funksiya calcSQRT($x) ( sqrt($x); ) umumiy statik funksiya getCount() ( self::$count; ) umumiy funksiya getCounter() ( $this->counter; ) qaytaring ) echo Math::calcSin(1);

    aks-sado "

    "; echo Math::calcSQRT(9); echo "

    $math_1 = new Math(); $math_2 = new Math(); $math_3 = new Math(); $math_4 = new Math(); echo "Yaratilgan ob'ektlar: " . Math::getCount();

    Ushbu yondashuv orqada qolgan ishlarni unutib, diqqatni o'z oldingizga qo'ygan vazifaga qaratish imkonini beradi. "; echo "Obyektlar yaratildi: " . $math_4->getCounter(); ?>

    Kimning holatida biz $hisoblagich sinfiga birlamchi quvvat qo'shsak, u konstruktorda ham bittaga ko'paydi.

    Agar asosiy quvvat ob'ektga tegishli bo'lsa, u ob'ektlarning chaqiruvlari orasida saqlanadi.

    Har safar sinfning (ob'ektning) namunasi yaratilganda, quvvat nolga teng bo'ladi, konstruktorda u bittaga oshiriladi.

    Statik kuch sinfga tegishli bo'lib, uning ahamiyati saqlanib qoladi.

    Quyida statik hokimiyat va usullarning ishini ochib beruvchi bir qator buttlar mavjud.

    Ushbu yondashuv orqada qolgan ishlarni unutib, diqqatni o'z oldingizga qo'ygan vazifaga qaratish imkonini beradi. Statik usulda vikorizatsiya qilishga urinish $this ni muvaffaqiyatsizlikka o'zgartiradi (Fatal xato: $this dan ob'ekt kontekstida bo'lmaganda foydalanish).

    yoshi.

    Statik quvvat har kuni sinf ob'ektlarida mavjud.

    Ushbu yondashuv orqada qolgan ishlarni unutib, diqqatni o'z oldingizga qo'ygan vazifaga qaratish imkonini beradi. "; print_r($TestClass); echo ""; ?>

    Statik usulni self::method() konstruksiyasi yordamida chaqirish mumkin.

    Ushbu yondashuv orqada qolgan ishlarni unutib, diqqatni o'z oldingizga qo'ygan vazifaga qaratish imkonini beradi. Butt:

    printSalom();

    ?>

    Statik quvvatni sinf, g'alaba va sintaksis kontekstida ajratish mumkin:

    echo TestClass::$age;

    Bundan tashqari, quvvatni maksimal darajada oshirishga urinish jazoga olib keladi: "O'limga olib keladigan xato: e'lon qilinmagan statik mulkka kirish".

    Statik quvvat sinf, g'alaba va sintaksis kontekstida o'zgartirilishi mumkin:

    TestClass::$age += 20;

    Ushbu yondashuv orqada qolgan ishlarni unutib, diqqatni o'z oldingizga qo'ygan vazifaga qaratish imkonini beradi. // Butt
    Statik usullar va kuchlar bilan kodning ko'proq misollari
    Bunday holda, butun dastur statik usullar va vakolatlarning muqobilidan ko'ra soddadir.
    Qanchalik oddiy kodni tushunsangiz, materialni shunchalik yaxshi eslab qolasiz.

    ".TestClass::$age; // echo TestClass::$txt; // Xato: jiddiy xato: e'lon qilinmagan statik xususiyatga kirish. echo "

    "; TestClass::sayHi(); echo "

    • "; TestClass::sayHello(); // Va eksa ob'ekt ($obj::$age) orqali statik o'zgaruvchiga kirishni rad etishga muvaffaq bo'ldi... echo "
    • $obj = yangi TestClass; echo "Biz kirishni ob'ekt orqali statik o'zgarishga kamaytirishimiz mumkin: " . $obj::$age; ?>
    • Iltimos, diqqat qiling va bu muhim, biz statik bo'lmagan sayHi() usuliga o'tdik, sintaksisni statik sinf elementlariga o'zgartirdik.
    • Rezyume; qayta boshlash
    • Golovna: statik kuch ob'ektlarga emas, balki sinflarga tegishli.
    • Statik usulni eng yuqori kuchlar va sinf usullariga kengaytirib bo'lmaydi, bu erda $this->name qo'llanilmaydi.
    • Statik usul self::$name yordamida statik organlarga kengaytirilishi mumkin.
    • Statik sinf xususiyatlari ob'ektlar uchun mavjud emas.

    Asosiy usul self::$name yordamida statik quvvatga aylantirilishi mumkin.

    Statik vakolat sinf kontekstida sintaksis yordamida ifodalanishi mumkin: TestClass::$age .

    Birlamchi metodni ob'ekt kontekstida ($object->method()) va sinfni TestClass::method() sintaksisi yordamida chaqirish mumkin.

    Darhaqiqat, noyob yaratilgan ob'ekt bo'lgan Math sinfida matematik usullarga to'g'ridan-to'g'ri kirish juda oson.

    Reg.ru: domen va xosting

    Rossiyadagi eng yirik registrator va xosting provayderi.

    Xizmatda 2 milliondan ortiq domen nomlari.

    Yetkazib berish, domen uchun pochta, biznes uchun yechim.

    700 mingdan ortiq. Butun dunyodagi mijozlar allaqachon o'z tanlovlarini qilishgan.

    *Sichqoncha kursorini aylantirishni kamaytirish uchun harakatlantiring.

    Orqaga Oldinga

    PHPda statik usullar va quvvat

    Oldingi materiallarda biz PHPda ob'ektga yo'naltirilgan dasturlashning asosiy imkoniyatlarini o'zlashtirdik va endi murakkabroq va murakkab jihatlarni o'rganishga o'tdik.

    Bundan oldin biz doimo ob'ektlar bilan ishlaganmiz.

    Biz sinflarni ob'ektlar yaratiladigan naqshlar, ob'ektlarni esa faol komponentlar, biz chaqiradigan usullar va kirish taqiqlangan hokimiyatlar sifatida tavsifladik.

    Ma'lum bo'lishicha, ob'ektga yo'naltirilgan dasturlashda haqiqiy robot sinflar misollari yordamida amal qiladi. Va ular tayyor bo'lganda, ular faqat ob'ektlarni yaratish uchun shablondir..

    Bu, albatta, oddiy emas.

    Biz ikkala usul va vakolatlarga ob'ekt emas, balki sinf kontekstida kirishimiz mumkin. Bunday usullar hokimiyat tomonidan "statik" deb ataladi va ular qo'shimcha kalit so'z uchun ayblanadi

    statik

    Class StaticExample ( statik umumiy $aNum = 0; statik umumiy funksiya sayHello() ( "Salom!"; ) chop eting)

    Statik usullar

    - bu funksiyalar sinf kontekstiga o'xshaydi. Ularning o'zlari sinfning biron bir asosiy vakolatlariga kirishni rad eta olmaydi, chunki bunday vakolatlar ob'ektlarga tegishli. Biroq, statik usullardan, siz allaqachon ohangdor tarzda taxmin qilganingizdek, siz statik kuchlarga o'tishingiz mumkin.

    Agar siz statik vakolatni o'zgartirsangiz, uning sinfidagi barcha misollar yangi qiymatga kirishdan bosh tortishi mumkin. Ularning o'zlari sinfning biron bir asosiy vakolatlariga kirishni rad eta olmaydi, chunki bunday vakolatlar ob'ektlarga tegishli. Statik elementga kirish ob'ekt namunasi orqali emas, balki sinf orqali amalga oshirilganligi sababli, biz ob'ektga yuboriladigan o'zgartirishga muhtoj emasmiz.

    Statik usul yoki o'sha sinfdan (bolalar sinfidan emas) quvvatga kirishni rad etish uchun biz kalit so'zdan foydalanamiz. o'zini.

    Kalit so'z o'zini ishlab chiqarish sinfga zoom uchun vikoristovuetsya, va psevdo-o'zgartirish $bu- Ishlab chiqarish liniyasiga qadar. Sinflararo tufayli Statik misol Biz achchiqlanish darajasiga qadar shafqatsiz bo'lamiz$aNum

    sinfim nomidan yordam uchun.

    StaticExample::$aNum; Sinflararo tufayli Va sinf o'rtasida o'zini.

    kalit so'zni wikilistga kiritishingiz mumkin

    Class StaticExample ( statik umumiy $aNum = 0; statik umumiy funksiya sayHello() ( self::$aNum++; chop etish "Salom! (" . self::$aNum . ")\n"; ) ) Hurmatni tiklash:

    Yirtqichning Otaning sinfiga qayta tayinlangan usuliga tushishiga qo'shimcha ravishda, "::" konstruktsiyasi har doim statik usullar yoki hokimiyatlarga kirish uchun suiiste'mol qilinadi. $bu Belgilanganidek, ob'ektda statik usullar chaqirilmaydi.

    Shu sabablarga ko'ra statik usullar va quvvat ko'pincha o'zgaruvchan va sinfiy kuch deb ataladi.

    Aslini olganda, siz psevdo-o'zgarishni vikorize qila olmaysiz

    statik usulning o'rtasida. Statik usul va quvvat o'rtasidagi kelajak nima?

    Biz eng muhim taomga yetdik. O'ng tomonda statik elementlar bir qator turli xil xususiyatlarni namoyish etadi.

    Birinchidan , ular stsenariyning istalgan nuqtasidan foydalanish mumkin (agar siz sinfga kirish imkoningiz bo'lsa). Bu shuni anglatadiki, siz sinfning namunasini bir ob'ektdan ikkinchisiga o'tkazmasdan yoki undan ham yomoni, global o'zgarishdagi ob'ekt namunasini saqlamasdan funktsiyani kengaytirishingiz mumkin.

    Boshqa yo'l bilan Statik quvvat ushbu sinf ob'ektining teri nusxasi uchun mavjud. Shunday qilib, siz ushbu turdagi barcha ob'ektlar uchun mavjud bo'lishi mumkin bo'lgan qiymatlarni aniqlashingiz mumkin. Statik quvvat ushbu sinf ob'ektining teri nusxasi uchun mavjud. Men bilaman, uchinchisida, Gap shundaki, ona sinf o'zining statik kuchiga yoki usuliga kirish uchun namunaga muhtoj emas, bu esa yaratilgan ob'ektlarning misollarini yaratishga imkon beradi, shu jumladan oddiy funktsiyani chaqirish uchun.

    Ko'rsatish uchun sinf uchun statik usul yarataylik

    ShopMahsulot , bu avtomatik ravishda ob'ektlarning nusxalarini yaratadi. Statik quvvat ushbu sinf ob'ektining teri nusxasi uchun mavjud. Qo'shimcha yordam uchun SQLite jadvali

    mahsulotlar Statik quvvat ushbu sinf ob'ektining teri nusxasi uchun mavjud., Bizda ko'proq dastlabki materiallarda qanday ijod mavjud?

    Ehtimol siz bilganingizdek, PDO PHP ma'lumotlar ob'ektini anglatadi.

    PDO klassi turli xil ma'lumotlar bazasi dasturlari uchun universal interfeysni ta'minlaydi. , bu avtomatik ravishda ob'ektlarning nusxalarini yaratadi// Class ShopProduct xususiy $id = 0; Statik quvvat ushbu sinf ob'ektining teri nusxasi uchun mavjud. umumiy funktsiya setID($id) ( $this->id = $id; ) // ... umumiy statik funksiya getInstance($id, PDO $pdo) ( $stmt = $pdo->prepare("mahsulotlardan * ni tanlang) qaerda id=?"); $natija = $stmt->execute(massiv($id)); $satr = $stmt->fetch(); if (bo'sh($satr)) (null; ) agar ($) satr["turi"] == "kitob") ( $mahsulot = yangi KitobMahsuloti($satr["title"], $satr["firstname"], $satr["mainname"], $satr["narx"] , $row["numpages"] ) else if ($row["type"] == "cd") ( $product = new CdProduct($row["title"], $row["firstname"], $row ["mainname"], $row["price"], $row["playlength"] ) else ( $product = new ShopProduct($row["title"], $row["firstname"], $row[" mainname"], $row["price"] ) $product->setId($row["id"] ) // ... Yak bakit, usul ob'ektni yozish uchun aylantiradi

    , va stendda maydon qiymatlariga ega bo'lish etarli darajada "oqilona"

    turi

    zarur xususiyatlarga ega ob'ektni yaratish. , bu avtomatik ravishda ob'ektlarning nusxalarini yaratadi Misol imkon qadar qisqa bo'lishi uchun men kechirimlarni qayta ishlash uchun kodni ataylab o'tkazib yubordim. Statik quvvat ushbu sinf ob'ektining teri nusxasi uchun mavjud..

    Misol uchun, ushbu kodning haqiqiy ishlaydigan versiyasi bilan biz juda ishona olmaymiz va PDO ob'ektini o'tkazish to'g'ri yaratilgan va kerakli ma'lumotlar bazasiga ulangan deb taxmin qila olmaymiz.

    Aslida, biz PDO ob'ektini bunday xatti-harakatni kafolatlaydigan sinfga joylashtirishimiz kerak.

    Ungacha keling, kelgusi materiallarimizdan biriga qaytaylik.

    "Zavod" atamasi ob'ekt namunalarini yaratish uchun tayinlangan koddan oldin qo'shiladi.


    Bunday "zavodlar" ning dumbalari bilan biz hali ham sizga yaqinmiz.

    Doimiy hokimiyat organlari

    O'zgarishga hokimiyatdagilarning aybi yo'q. Masalan, dasturga aylanadigan kodlash yoki kodlash kabi elementlar sinflarda qo'lda tayinlanishi kerak..

    Garchi ular yashirin va statik bo'lib qolishi mumkin bo'lsa-da, mijoz kodi ularni o'zgartirish qobiliyati uchun javobgar emas.

    Va buni sinf o'rtasida doimiy kuch bilan bog'lash mumkin.

    Global konstantalar singari sinf konstantalarini ham aniqlangandan keyin o‘zgartirib bo‘lmaydi.

    Qo'shimcha kalit so'zlar uchun ovoz berish huquqi

    const

    Yirik hokimiyatlarga kelsak, hukumat nomlari oldiga dollar belgisi qoʻyilmaydi.

    Qabul qilish uchun ularga ko'pincha oddiy qurol kabi buyuk yozuvchilarning nomlariga o'xshash nomlar beriladi:

    Class ShopProduct (const AVAILABLE = 0; const OUT_OF_STOCK = 1; // ...

    Doimiy organlar elementar turdagi ma'nodan tashqari qasos olishlari mumkin.
    Ob'ektga doimiylarni belgilash mumkin emas.


    Word-da qanday qilib diagramma yaratish - oson bajariladigan qo'llanma