PHP intervjuuks valmistumine: märksõna "staatiline. Staatiliste muutujate lõksud

07.08.2016 18:37 Külaline: Bashibuzuk Alexander

Lihtsalt imeline!
Süžeed, tegelased, dialoogid...
Kõik on ülikonnas ja värvitoonis, ilma moonutamata.
Väga hästi kirjutatud. See paistab teravalt silma väävli langeva massi taustal.
Ainus asi on relvatüüpide ja -tüüpide ülekoormus mitte alati täpsete kirjeldustega, kuid see on väga haruldane.
Ainus juuksenõel, mida ma saan tõsiselt lubada, on pärit "Sissepääs valest küljest" - Caracali pataljon (kõrbekass) IDF - segaüksus (mehed ja naised) kõrbes operatsioonideks ja millel pole midagi ühist Golaniga. brigaad (dessantvägi) . Ülejäänu osas on kõik täiesti õige.
Suur tänu raamatute eest
Ma tõesti tahan Feldkornetile järge näha.
Aitäh veelkord!!!

10.07.2018 07:50 Külaline: Bashibuzuk Alexander

V.I.P.: Korraga lugesin kogu Bashibazuki läbi. Kuigi pseudonüüm on eputav ja rumal, on kõik loetav, ükskõik, kes mida ütleb. Igal juhul ei märganud ma lugemises erilist jama. Mul oli mehe üle hea meel. Lootusega avasin tema viimase ja loogiliselt parima "Tagauksest" saates Flibust. Ja kahetsusega olen taas veendunud, et maailmas pole täiuslikkust. GG on NKVD (peaaegu GRU) töötaja, kuigi ta on diversant (kuigi ta on kust pärit major), kuid kahe eriharidusega ja isegi tsiviilülikoolis alustanud. Ja siis igal sammul need odavad, korraga “persse”, korraga “persse”, “persse”, “redigeeri”, “persse”, “persse”, “persse”, “persse”, noh, "Arktika rebane" on üldiselt meie ajast pärit. Nii paljudesse haridusklassidesse selline kõne jõuab ja miks see nii on. Ma ei tea, mis edasi saab, aga juba on tunda primitiivsust, ausalt öeldes “Poseljagini” süžeest, esituslaadist, peategelase idiootsetest arutlustest ja järeldustest, papist tegelaskujudest, nende elutud dialoogid toimuva ebareaalsusest isegi ilukirjanduse jaoks. Kõik see ja palju muud ajab sind iiveldama ja tekitab soovi lugemisest loobuda. Noh, ma ei saanud kunagi aru, noh, ma ajasin "rikkumatut" laiali, lugesin seda (või ei lugenud?), Kas see ei kahjusta mu silmi? Lõppkokkuvõttes visake need kõik välja sõna "persse" kaudu (sellepärast, et rõhutada individuaalsust, et milleks see pagana, või äkki lahedus, milleks?) ja isegi lihtne tekst kõlab täiesti erinevalt. Ja kui see seda ei lõika, siis ma ei tea, võib-olla kirjutas selle keegi teine. Ja kui ta vabastati, siis võib-olla oleks parem lõpetada kirjanduslik piin ja lõpetada rumala primitiivsuse piinamine.

23.07.2018 13:22 Külaline: Bashibuzuk Alexander

V.I.P.: Noh, lisaks “hoorale” ja muule sarnasele (ilmselt ikka lihtne ja lahe tüüp) ilmusid Bushi loll “tead” ja veel rumalam “jah”. Ühesõnaga täielik komplekt. Ja ometi, ma saan aru, et kõik tahavad “suure mehega” koos olla ja palju naisi korraga saada, vähemalt nende enda “loomingus”, aga kui see on täiesti primitiivne ja plagiaat, siis ta tooks vähemalt midagi uut sisse. suhe viimasega, ta meeldiks teie vaadatud pornot vms. Kuigi kust pärineb originaalsus, põhineb see kõik samal stsenaariumil.

Rakendus

Sõdades Euroopa riikide vastu bashibazouki osutus tavaliselt täiesti vastuvõetamatuks. Neid oli võimatu organiseerida ja distsiplineerida ning isegi selle enda peale võtnud välismaa kindralite (prantsuse kindral Yusuf, inglise Beatson) pingutused ei aidanud selles suunas. Et teha lõpp nende rüüstamisele riigis ning mõeldamatule julmusele ja vägivallale, mis tsiviilelanike vastu on tabatud, olid Türgi regulaarväed sunnitud rohkem kui korra desarmeerima. bashi-bazouks. Nad demonstreerisid täielikult oma röövellikke kalduvusi aprillimässu mahasurumisel Bulgaarias ja viimases Vene-Türgi sõjas aastatel 1877–1878.

Maine

Nimi bashi-bazouks on muutunud üldkasutatavaks sõnaks, et kirjeldada inimest, kes on võimeline kõige jõhkramaks vägivallaks. Karistustegevus bashi-bazouks kirjeldas vene filosoof V.S. Solovjov dokumentaalmaterjalil põhinevas essees "Kolm vestlust sõjast, progressist ja maailmaajaloo lõpust".

Vaata ka

  • Pindari- Indias
  • Serdyuki - Ukrainas

Kirjutage arvustus artikli "Bashi-bazouki" kohta

Märkmed

Kirjandus

  • // Sõjaväeentsüklopeedia: [18 köites] / toim. V. F. Novitsky [ja teised]. - Peterburi.
  • ; [M.]: Tüüp.

t-va I.V., 1911-1915.

  • // Brockhausi ja Efroni entsüklopeediline sõnaraamat: 86 köites (82 köidet ja 4 lisa). - Peterburi. , 1890-1907. Lingid Montgomery, vikont Bernard (1968).

Sõjapidamise ajalugu

, The World Publishing Company. ISBN 978-0-688-01645-6.
Bashibazukit iseloomustav väljavõte
Mööda Khamovniki sõiduradasid kõndisid vangid üksi oma konvoi ja valvuritele kuulunud vankrite ja vagunitega, mis sõitsid nende taga; kuid varustuspoodidesse minnes leidsid nad end keset tohutut, tihedalt liikuvat suurtükiväekonvoi, mis oli segamini erakärudega.
Möödunud Krimmi Fordist, liikusid vangid paar sammu korraga ja jäid seisma ning liikusid uuesti ning igalt poolt hakkasid meeskonnad ja inimesed üha piinlikumaks muutuma. Pärast enam kui tunni pikkust kõndimist paarsada sammu, mis eraldavad silda Kalužskaja tänavast, ja jõudnud väljakule, kus Zamoskvoretski tänavad kohtuvad Kalužskajaga, peatusid hunnikusse surutud vangid ja seisid sellel ristmikul mitu tundi. Igalt poolt oli kuulda lakkamatut rataste mürinat, jalgade trampimist ning lakkamatut vihast karjet ja needust, nagu merekohin. Pierre seisis surutuna vastu põlenud maja seina ja kuulas seda heli, mis tema kujutluses sulas kokku trummihelidega.
Mitmed tabatud ohvitserid ronisid parema ülevaate saamiseks põlenud maja seinale, mille lähedal Pierre seisis.
- Rahvale! Eka inimesed!.. Ja nad kuhjasid püssi! Vaata: karusnahad... - nad ütlesid. "Näe, pätid, nad röövisid mind... See on tema taga, vankri peal... Lõppude lõpuks on see ikoonilt, jumal!... Need peavad olema sakslased." Ja meie mees, jumala eest!.. Oh, kaabakad!.. Vaata, ta on koormatud, ta kõnnib jõuga! Siin nad tulevad, droshky - ja nad püüdsid selle kinni!.. Näete, ta istus rinnale. Isad!.. Läksime tülli!..
- Nii et löö teda näkku, näkku! Sa ei jõua õhtuni oodata. Vaata, vaata... ja see on ilmselt Napoleon ise. Näete, millised hobused! krooniga monogrammides. See on kokkupandav maja. Ta viskas koti maha ja ei näe seda. Jälle tülitsesid... Naine lapsega ja üldse mitte paha. Jah, muidugi, nad lasevad su läbi... Vaata, lõppu pole. Vene tüdrukud, jumala eest, tüdrukud! Need on kärus nii mugavad!
Jällegi lükkas üldise uudishimu laine Khamovniki kiriku lähedal kõik vangid tee äärde ja Pierre nägi tänu oma pikkusele üle teiste peade, mis vangide uudishimu oli äratanud. Kolmes jalutuskärus, laadimiskastide vahel segamini, sõitsid naised, istudes tihedalt üksteise otsas, riietatud, erksates värvides, räämas, karjusid midagi kriuksuvate häältega.

Kuigi suurem osa olemasolevast PHP 5 koodist peaks töötama ilma muudatusteta, peaksite pöörama tähelepanu järgmistele tagasiühildumatutele muudatustele:

  • rusumine () naaseb NULL kui PHP 5.2.1 seisuga on vastu võetud ühildumatud argumendid.
  • ZipArchive::setCommentName() naaseb TÕSI edu kohta PHP 5.2.1 seisuga.
  • ZipArchive::setCommentIndex() naaseb TÕSI edu kohta PHP 5.2.1 seisuga.
  • SplFileObject::getFilename() tagastab failinime, mitte suhtelise/tee/faili/faili nime, PHP 5.2.1 seisuga.
  • PHPRC keskkonnamuutuja prioriteeti muudetud Win32-s PHPRC keskkonnamuutujal on nüüd prioriteet Windowsi registrisse salvestatud tee suhtes.
  • CLI SAPI ei kontrolli enam cwd-s php.ini ega faili php-cli.ini PHP 5.1.x-s lisati dokumenteerimata funktsioon, mis pani CLI binaarfaili kontrollima PHP konfiguratsioonifaili praegust töökataloogi, mis võib ootamatu konfiguratsioonifaili lugemisel põhjustada ettearvamatut käitumist. See funktsioon eemaldati versioonis 5.2.0 ja PHP ei otsi enam CWD-st php.ini või php-cli.ini failide olemasolu.
  • Vaadake ka juhendi käsurea jaotist. Lisatud hoiatus mooduli 0 toimingute sooritamisel PHP varasemates versioonides ei andnud täisarvu % 0 täitmine hoiatusteateid, vaid tagastas ootamatu tagastusväärtuse VALE . Alates PHP 5.2.0-st annab see toiming välja an

    E_HOIATUS
    , nagu ka kõigil muudel juhtudel, kui tehakse nulliga jagamine.
    ?>

  • print 10% 0 ; /* Hoiatus: nulliga jagamine failinimes real n */ Muudeti __toString(), et seda kutsutaks igal võimalusel.

    Maagilist meetodit __toString() kutsutakse nüüd stringi kontekstis, st kõikjal, kus objekti stringina kasutatakse.
    Objekti identifikaatorit sisaldava stringi tagastamise tagavara jäeti PHP 5.2.0-s välja. See muutus problemaatiliseks, kuna objekti identifikaatorit ei saa pidada unikaalseks. See muudatus tähendab, et teie rakendus on vigane, kui kasutasite tagastatava väärtusena objekti identifikaatorit. Katse kasutada seda väärtust stringina põhjustab nüüd tabatava saatusliku vea.
    klass foo()
    $foo = uus foo ;
    print $foo ;
    ?>

    /* Tabatav fataalne viga: Object of class foo võiks ei teisendata stringiks failinimes real n */. Isegi __toString() puhul ei saa objekte kasutada massiiviindeksite ega võtmetena. Võime lisada selle jaoks sisseehitatud räsitoe hiljem, kuid alates PHP 5.2.x-st peate kas pakkuma oma räsi või kasutama uut SPL-funktsiooni

    spl_object_hash()
    Meetoditest __toString() ei saa erandeid teha.
    klassi foo (
    }
    }

    avalik funktsioon __toString() (
    viska uus Erand ;
    proovi (
    prindi uus foo ;
    /* Saatuslik viga: meetod foo::__toString() peab
    ?>

  • ära tee erandit failinimes real n */ ) saak (Erand $e ) ()

    Abstraktsed staatilised klassifunktsioonid on välja jäetud. {
    Kõrvalekalde tõttu lubasid PHP 5.0.x ja 5.1.x klassides kasutada abstraktseid staatilisi funktsioone. Alates PHP 5.2.x-st võivad need olla ainult liidestel.
    abstraktne klass foo
    abstraktne staatiline funktsioon
    bar();
    }
    ?>

  • /* Ranged standardid: staatiline funktsioon foo::bar()
  • ei tohiks olla abstraktne failinimes real n */ Oracle'i laiendus nõuab Windowsis vähemalt Oracle 10. Lisatud RFC2397 ( "Andmete" URL-i skeemi kasutuselevõtt võib viia Windowsi käitumise muutumiseni. Kui töötate NTFS-failisüsteemiga ja kasutate oma rakenduses metavooge ning kui juhtute lihtsalt kasutama faili nimega "data:", millele pääsete juurde ilma teeteabeta, siis see ei tööta. Veel parandus on kasutada sellele juurdepääsul protokolli "fail:". Vaata ka » RFC 2397

    /* kui allow_url_include on VÄLJAS (vaikimisi) */
    sisaldama "data:;base64,PD9waHAgcGhwaW5mbygpOz8+";
    /* Hoiatus: include(): URL faili juurdepääs on keelatud
    serveri konfiguratsioonis failinimes real n */
    ?>

  • Regressioon sisse glob() mustrid Versioonis 5.2.4 põhjustas turbeparandus vormi "/foo/*/bar/*" mustrite regressiooni. Alates versioonist 5.2.5 hoiatuse asemel glob() funktsioon naaseb PHP varasemates versioonides ei andnud täisarvu % 0 täitmine hoiatusteateid, vaid tagastas ootamatu tagastusväärtuse millal openbase_dir piiranguid rikutakse.
  • Õpetus

Pole saladus, et inimestele meeldib intervjuude ajal keerulisi küsimusi esitada. Mitte alati adekvaatne, mitte alati tegelikkusega seotud, kuid fakt jääb faktiks – küsitakse. Muidugi on küsimus erinev ja mõnikord on esmapilgul rumal tunduv küsimus tegelikult suunatud sellele, et testida, kui hästi sa seda keelt valdad, milles kirjutad.

Proovime ühe neist küsimustest "tükk tüki haaval" lahti võtta - Mida tähendab sõna "staatiline" PHP-s ja miks seda kasutatakse?

Staatilisel märksõnal on PHP-s kolm erinevat tähendust. Vaatame neid kronoloogilises järjekorras, nii nagu need keeles ilmusid.

Esimene väärtus on staatiline kohalik muutuja

funktsioon foo() ( $a = 0; kaja $a; $a = $a + 1; ) foo(); // 0 foo(); // 0 foo(); // 0

PHP-s on muutujad kohalikud. See tähendab, et funktsioonis (meetodis) defineeritud ja väärtusega antud muutuja eksisteerib ainult selle funktsiooni (meetodi) täitmise ajal. Meetodi väljumisel kohalik muutuja hävitatakse ja uuesti sisenemisel luuakse see uuesti. Ülaltoodud koodis on selline lokaalne muutuja $a - see eksisteerib ainult funktsiooni foo() sees ja luuakse iga kord, kui seda funktsiooni kutsutakse. Muutuja suurendamine selles koodis on mõttetu, kuna juba järgmisel koodireal lõpetab funktsioon oma töö ja muutuja väärtus läheb kaotsi. Ükskõik kui mitu korda funktsiooni foo() kutsume, väljastab see alati 0...

Kõik aga muutub, kui paneme ülesande ette staatilise märksõna:

Funktsioon foo() ( staatiline $a = 0; kaja $a; $a = $a + 1; ) foo(); // 0 foo(); // 1 foo(); // 2

Staatilisel märksõnal, mis on kirjutatud enne kohalikule muutujale väärtuse määramist, on järgmised mõjud:

  1. Ülesanne sooritatakse ainult üks kord, funktsiooni esimesel kutsel
  2. Sel viisil märgitud muutuja väärtus salvestatakse pärast funktsiooni lõppu.
  3. Funktsiooni järgmistel väljakutsetel saab muutuja määramise asemel varem salvestatud väärtuse
Sellist sõna staatiline kasutamist nimetatakse staatiline kohalik muutuja.
Staatiliste muutujate lõksud
Muidugi, nagu alati PHP-s, on mõningaid lõkse.

Esimene kivi on see, et staatilisele muutujale saab määrata ainult konstante või konstantseid avaldisi. Siin on kood:
staatiline $a = bar();
viib paratamatult parseri veani. Õnneks on alates versioonist 5.6 saanud võimalikuks määrata mitte ainult konstante, vaid ka konstantseid avaldisi (näiteks “1+2” või “”) ehk avaldisi, mis ei sõltu muust koodist ja mida saab arvutada koostamise etapis

Teine kivi on see, et meetodid eksisteerivad ühes eksemplaris.
Siin on kõik veidi keerulisem. Olemuse mõistmiseks on siin kood:
klass A ( avalik funktsioon foo() ( staatiline $x = 0; kaja ++$x; ) ) $a1 = uus A; $a2 = uus A; $a1->foo(); // 1 $a2->foo(); // 2 $a1->foo(); // 3 $a2->foo(); // 4
Vastupidiselt intuitiivsele ootusele “erinevad objektid – erinevad meetodid” näeme selles näites selgelt, et PHP dünaamilised meetodid “ei korruta”. Isegi kui meil on sada selle klassi objekti, eksisteerib meetod ainult ühes eksemplaris, iga kõne korral lisatakse sellele erinev $this.

Selline käitumine võib olla ootamatu arendajale, kes pole selleks valmis ja võib olla vigade allikas. Tuleb märkida, et klassi (ja meetodi) pärimine viib uue meetodi loomiseni:

Klass A ( avalik funktsioon foo() ( staatiline $x = 0; kaja ++$x; ) ) klass B laiendab A ( ) $a1 = uus A; $b1 = uus B; $a1->foo(); // 1 $b1->foo(); // 1 $a1->foo(); // 2 $b1->foo(); // 2

Järeldus: PHP dünaamilised meetodid eksisteerivad klasside, mitte objektide kontekstis. Ja ainult käitusajal toimub asendus "$this = current_object".

Teine tähendus on klasside staatilised omadused ja meetodid

PHP objektimudelis on võimalik määrata atribuute ja meetodeid mitte ainult objektidele - klassi eksemplaridele, vaid ka klassile tervikuna. Selleks kasutatakse ka staatilist märksõna:

Klass A ( public static $x = "foo"; public static function test() ( return 42; ) ) echo A::$x; // "foo" kaja A::test(); // 42
Sellistele omadustele ja meetoditele juurdepääsuks kasutatakse topeltkoolonit (“Paamayim Nekudotayim”), näiteks CLASS_NAME::$Muutujanimi ja CLASS_NAME::Metodinimi().

On ütlematagi selge, et staatilistel omadustel ja staatilistel meetoditel on oma omadused ja lõksud, mida peate teadma.

Esimene omadus on banaalne – $see pole olemas. Tegelikult tuleneb see staatilise meetodi definitsioonist – kuna see on seotud klassi, mitte objektiga, pole pseudomuutuja $this, mis osutab dünaamilistes meetodites praegusele objektile, saadaval. Mis on täiesti loogiline.

Siiski peate teadma, et erinevalt teistest keeltest ei tuvasta PHP parsimise või kompileerimise etapis olukorda "$see on kirjutatud staatilisel meetodil". Selline viga võib ilmneda ainult käitusajal, kui proovite käivitada koodi $this staatilise meetodi sees.

Selline kood:
klass A ( public $id = 42; staatiline avalik funktsioon foo() ( kaja $this->id; ) )
ei põhjusta vigu seni, kuni te ei proovi foo() meetodit sobimatult kasutada:
$a = uus A; $a->foo();

(ja kohe kuvatakse "Saatuslik viga: $this kasutamine, kui see pole objekti kontekstis")
Teine omadus on see, et staatilisus ei ole aksioom!
klass A ( staatiline avalik funktsioon foo() ( kaja 42; ) ) $a = new A; $a->foo();

See on kõik, jah. Staatilist meetodit, kui see ei sisalda koodis $this, saab kutsuda dünaamilises kontekstis, nagu objektmeetodit. See ei ole PHP viga.
Vastupidine pole täiesti tõsi:
klass A ( avalik funktsioon foo() ( kaja 42; ) ) A::foo();

Dünaamilist meetodit, mis ei kasuta $this, saab käivitada staatilises kontekstis. Siiski saate tasemel E_STRICT hoiatuse "Mittestaatilist meetodit A::foo() ei tohiks staatiliselt kutsuda". Teie otsustada, kas järgida rangelt koodistandardeid või keelata hoiatused. Eelistatav on muidugi esimene.

Ja muide, kõik ülalkirjeldatud kehtib ainult meetodite kohta. Staatilise atribuudi kasutamine "->" kaudu on võimatu ja põhjustab saatusliku vea.

Kolmas tähendus, mis tundub olevat kõige raskem – hiline staatiline sidumine

PHP-keele arendajad ei piirdunud märksõna “staatiline” kahe tähendusega ja lisasid versioonis 5.3 keelele veel ühe “funktsiooni”, mida rakendatakse sama sõnaga! Seda nimetatakse "hiliseks staatiliseks sidumiseks" või LSB-ks (Late Static Binding).

Klassi mudel ( public static $table = "tabel"; public staatiline funktsioon getTable() ( tagastab ise::$table; ) ) echo Model::getTable(); // "tabel"
Iseseisev märksõna PHP-s tähendab alati "klassi nime, kus see sõna on kirjutatud". Sel juhul asendatakse self klassiga Model ja self::$table mudeliga Model::$table.
Seda keelefunktsiooni nimetatakse "varajaseks staatiliseks sidumiseks". Miks varakult? Sest enese ja konkreetse klassinime sidumine ei toimu mitte käitusajal, vaid varasemates etappides – koodi parsimisel ja kompileerimisel. Noh, "staatiline" - sest me räägime staatilistest omadustest ja meetoditest.

Muudame veidi oma koodi:

Klassi mudel ( public static $table = "tabel"; public staatiline funktsioon getTable() ( tagastab ise::$table; ) ) klass Kasutaja laiendab mudelit ( public static $table = "users"; ) echo User::getTable() ; // "tabel"

Nüüd saate aru, miks PHP selles olukorras ebaintuitiivselt käitub. self seostati mudeliklassiga, kui kasutajaklassist midagi ei teatud, ja osutab seetõttu mudelile.

Mida ma peaksin tegema?

Selle dilemma lahendamiseks leiutati käitusfaasis "hiline" sidumismehhanism. See töötab väga lihtsalt - lihtsalt kirjutage sõna "self" asemel "staatiline" ja ühendus luuakse klassiga, mis seda koodi kutsub, mitte sellega, kus see on kirjutatud:
class Mudel ( public static $table = "tabel"; public staatiline funktsioon getTable() ( tagastab static::$table; ) ) class Kasutaja laiendab Model ( public static $table = "users"; ) echo User::getTable() ; // "kasutajad"

See on salapärane "hiline staatiline köitmine".

Peab märkima, et suurema mugavuse huvides on PHP-s lisaks sõnale “staatiline” ka spetsiaalne funktsioon get_sauctud_class(), mis annab sulle teada, millise klassi kontekstis sinu kood parasjagu töötab.

Head intervjuud!