Autor Zpráva
candiess
Profil
Zdravím vás kolegové,
dneska jsem velice hloubal nad syntaxí JS a PHP. Konkrétně mi jde o syntaxi funkcí v těchto jazycích.

Ani ne definici funkce jako spíš její aplikování, v PHP se funkcí dává minimálně jeden parametr a to samotná proměnná, kdežto v JS se funkce "připíná" k procesu.

Abych byl konkrétní:
<script type="text/javascript">
var my_text = "Dneska jsem byl na horách.";
var my_split = my_text.split(" ");
</script>

<?php
 $my_text = "Dneska jsem byl na horách.";
 $my_split = explode(" ",$my_text);
?>

Doufám, že jste pochopili o co mi jde, chci se tedy zeptat, proč jsou takto odlišné syntaxe? A jak se tyto syntaxe nazývají?
Vím, že ta syntaxe co je v JS je i v C++ a nebo ve ActionScriptu.

Druhou části otázky bych se chtěl s vámi zamyslet nad tím, proč když PHP f-cím předáváme parametr, není stále na stabilní pozici? Tím mám na myslí, že jako 1. parametr by měla být právě ta proměnná se kterou se bude pracovat. Osobně si myslím, že by se předešlo ztrátě času při lazení nebo přemýšlením nad parametry dané f-ce.

Díky moc předem :)
ShiraNai7
Profil
candiess:
Doufám, že jsem pochopili o co mi jde, chci se tedy zeptat, proč jsou takto odlišné syntaxe? A jak se tyto syntaxe nazývají?

PHP nepoužívá pro nativní typy objekty, proto se předávají takhle.
candiess
Profil
ShiraNai7:
Mohu poprosit o rozvedení spojení "pro nativní typy objektů" nebo nějakou vystihující alternatívu? Google mi hází jinčí významy..

proto se předávají takhle.
Je ještě nějaký jazyk, kde se předávají takhle?
Radek9
Profil
candiess:
pro nativní typy objektů
Tím se myslí primitivní typy jako string, number atd.

Je ještě nějaký jazyk, kde se předávají takhle?
Např. C, v tom je taky PHP napsané.

Jde o to, že v JS je string i číslo objekt, tudíž se s tím dá pracovat pohodlněji. V PHP si můžeš udělat leda obal, ale práce s tím je dost kostrbatá.
candiess
Profil
Radek9:
v JS je string i číslo objekt
Jak to jako myslíš? Mohu vidět příklad?

Proměnná by snad měla obsahovat hodnotu, tak proč uvádíš, že v PHP lze udělat pouze obal?
Radek9
Profil
candiess:
Jak to jako myslíš? Mohu vidět příklad?
To nejde úplně ukázat, jde o ten tečkový zápis (v PHP je to šipka). To je objektový přístup. Tzn., že v JS napíšeš tohle:
var array = "nějaký textový řetězec".split(" ");
Ale v PHP tohle:
$array = explode(" ", "nějaký textový řetězec");
// Tohle nefunguje:
$array = "nějaký textový řetězec"->explode(" ");
// Musel bys udělat tohle:
$array = (new StringWrapper("nějaký textový řetězec"))->explode(" ");

Proměnná by snad měla obsahovat hodnotu
Hodnotu nebo odkaz na objekt. Při práci s těmi primitivními typy v JS se vytvoří dočasný objekt (něco jako ten wrapper v PHP), ale automaticky, takže se to chová jako objekt.
candiess
Profil
Radek9:
Jojo chápu, děkuji moc za vysvětlení :) Jinak nechceš se nějak vyjádřit k tomu druhému bodu v #1? Docela rád bych znal váš názor.
Radek9
Profil
candiess:
Možná se mnou někteří diskutující nebudou souhlasit, ale dle mě je to proto, že vývojáři PHP jsou prasata bez kouska citu pro přehledný systém. :D PHP se plácalo narychlo jako jednoduchý scriptovací jazyk. A taky to tak dopadlo. Nikdy to nebylo myšleno jako jazyk pro vývoj větších aplikací. A aby to šlo, tak je tam dost bastlu, kvůli kterému je to totální splácanina.

Jestli máš možnost dělat na serveru s něčím jiným (např. ASP.NET nebo Node.js), tak bych to být tebou bral všema deseti. To jsou hezky ucelené a přehledné technologie.
juriad
Profil
ještě přispěji svou troškou z jiného světa: C vs C++

demonstrovat to budu na vlastním typu, který si vytvořím: dvouprvkovém vektoru, který budu násobit celým číslem

typedef struct vektor2 vektor2; // jen abych nemusel pořád psát struct

struct vektor2 { // dvouprvkovy vektor
  int hodnota1;
  int hodnota2;
}

vektor2 vynasob(vektor2 v, int kolikrat) { // funkce pro násobení
  vektor2 nasobek;
  nasobek.hodnota1 = v.hodnota1*kolikrat;
  nasobek.hodnota2 = v.hodnota2*kolikrat;
  return nasobek;
}

předchozí kód funguje v C i v C++, použití:
vektor2 vektor = { 1, 2 };
vektor2 trojnasobek = vynasob(vektor, 3);

navíc v C++ můžeš definovat vektor2 odlišně (v C ti to neprojde):

struct vector2 {
  int hodnota1;
  int hodnota2;
  
  vektor2 vynasob(int kolikrat) {
    vektor2 nasobek;
    nasobek.hodnota1 = hodnota1*kolikrat;
    nasobek.hodnota2 = hodnota2*kolikrat;
    return nasobek;
  }
}

a použití je nyní jiné:
vektor2 vektor = { 1, 2 };
vektor2 trojnasobek = vektor.vynasob(3);

Přesunula se jen definice funkce vynasob dovnitř struktury, a přitom přišla o první z argumentů.
I v C lze docílit stejné funkcionality jako poskytuje C++, ale trochu krkolomnějším způsobem.

upozorňuji, že se jedná jen o demonstraci, takto by se podle některých nemělo v C++ psát, byť to specifikace jazyka umožňuje :)
Alphard
Profil
candiess [#7]:
Jestli uvedete nějaký příklad, možná se ukáže, že různé pořadí parametrů má nějaké zdůvodnění, ale často je to prostě dáno historickým vývojem, prostě je v tom bordel. Jako když se porovná historické centrum starého města oproti pravidelným kolmým ulicím v nějakém nově založeném.

Radek9 [#8]:
Hostingů pro jiné jazyky je méně, ale existují. Každý má možnost volby, ale nemusí to být automaticky výhra. U větších projektů fakt nejde o syntaxi.
candiess
Profil
Alphard:
co třeba array_slice(), kde prvním parametrem je samotný vstup a naopak u explode(), str_replace(), substr() ,... jsou vstupní parametry až na konci. Je to jen filosofická otázka, proč nejsou vstupy jako 1 parametr, když jsou povinné?

juriad
Děkuji za vysvětlení, ale C ani jeho odvětvím nehovím, takže příkladu vůbec nerozumím, ovšem chápu, co jste mi chtěl naznačit, díky

Radek9
Díky, přečtu si o tom ;) jinak s tou splácaninou celkem souhlasím, proto PHP budí celkem dost otázek i těm zkušenějším.
ShiraNai7
Profil
candiess:
Je to jen filosofická otázka, proč nejsou vstupy jako 1 parametr, když jsou povinné?

Protože PHP. Názvosloví funkcí ani pořadí parametrů se neřídí podle jednotné konvence. Je to jedna z věcí, co mi na PHP vadí.
Tori
Profil
candiess:
Druhou části otázky bych se chtěl s vámi zamyslet nad tím, proč když PHP f-cím předáváme parametr, není stále na stabilní pozici?
IMHO je to tím, že céčko bylo zkonstruované, od začátku vznikalo se záměrem, že to bude jazyk s určitou strukturou, logikou (-li se nepletu). Kdežto PHP vzniklo jako šablonový stroj a až později dostalo ambice stát se prog. jazykem. Vyvíjelo se živelně jako lidské jazyky, proto i v něm zůstaly nepravidelnosti (jako psaní s/z, mě/mně a kopec výjimek z pravidel v češtině).
Jedna polemika za všechny: PHP: a fractal of bad design a reakce J. Vrány
weroro
Profil
candiess:
Vím, že ta syntaxe co je v JS je i v C++ a nebo ve ActionScriptu.
To bude tým, že ActionScript je odvodený práve od Javascriptu.

Ak by si chcel napr. v spomenutom ActionScripte vytvoriť novú funkciu, ktorá by sa zapisovala za názvom premennej nieco.funkcia(), musel by si si vytvoriť prototyp daného objektu (= prototype).

napr. prototyp na druhú mocninu:
Number.prototype.mocnina = function ():Number 
{
    return Math.pow (this, 2);
};
var cislo = 2;
trace (cislo.mocnina ()); // 4
Radek9
Profil
weroro:
musel by si si vytvoriť prototyp daného objektu
Ne, ten prototype už tam je, ty jen vytváříš jeho novou vlastnost.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0