PHP 함수 시그니처가 왜 그렇게 일관성이 없습니까? [닫은]


17

몇 가지 PHP 함수를 겪고 있었고 다음을 알아 차리지 못했습니다.

<?php
function foo(&$var) { }

foo($a); // $a is "created" and assigned to null

$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)

$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>

통지 array_key_exists()property_exists()기능. 첫 번째 매개 변수에서 속성 이름 (배열의 키)은 첫 번째 매개 변수이고 두 번째 매개 변수는 두 번째 매개 변수입니다. 직감적으로, 그들은 비슷한 서명을 가질 것으로 기대할 것입니다. 이로 인해 혼동이 발생할 수 있으며이 유형을 수정하면 개발 시간이 낭비 될 수 있습니다.

PHP 또는 그 문제에 대한 어떤 언어도 관련 함수의 서명을 일관성있게 만드는 것을 고려하지 않아야합니까?


2
+1 bravo, 이것은 내가 php에 대해 처음으로 알아 차렸고 항상 성가신 것을 발견했습니다.
Kevin

Meh. IDE를 사용하십시오.
벤 Dubuisson

답변:


10

당신이 제안하는 것은 본질적으로 서명을 많은 기존 기능으로 바꾸는 것입니다. 기존 코드에 어떤 영향을 미칠지 잠시 동안 생각하십시오. 이제 PHP 그룹이 함수의 30 % 서명을 변경하는 PHP 버전 N을 출시했다고 가정합니다. 이제 PHP vN과 PHP v. {N-1}에서 실행되는 코드를 작성해야한다고 상상해보십시오. 얼마나 재미 있습니까?

이제 호스트 또는 공동 데이터 센터 관리자라고 상상해보십시오. 일단 전환하면 모든 코드가 손상되고 사용자가 갈퀴와 횃불로 사무실에 올 경우 PHP vN을 지원해야하는 인센티브는 무엇입니까?


4
+1 일단 잘못된 방식으로 시작하면 어렵지만 현재 상태에서이를 사용하는 대규모 사용자 기반이 있습니다.
Andy Fleming

4
그건 좋은 지적이야. 나는 실제로 이것을 알고 있었지만, 나의 요점은 그들이 처음부터 이것을 알고 있어야한다는 것입니다.
Shamim Hafiz

7
@Shamim True, PHP가 처음에 나쁜 평판을 얻은 이유 중 일부입니다.)
Andy Fleming

1
PHP는 너무 많은 것들과 같이 작은 문제를 해결하기 위해 작은 도구로 시작했습니다. PHP가 "적절하게"다시 설계 되었다면 더 좋을 수도 있지만, 견인에 도달하지 못했을 것이므로 아무도 사용하지 않을 것입니다. ... 그리고 다른 작은 도구에는 "일치"가있을 것입니다. 다른 일관성이없는 도구입니다.
johannes

3
그래서 더 이상 사용되지 않는 것이 있습니다. 새로운 표준화 된 이름을 작성하고 함수 이름의 이전 "salad-bar"를 더 이상 사용하지 않지만 몇 가지 릴리스에 대해서는 그대로 두십시오. 잘 알려진 시점에서 새로운 메이저 버전 릴리스와 함께 나옵니다. 이것이이 방법입니다. PHP 개발자가이 작업을 수행하지 않은 것은 순수한 겁쟁이입니다. 그들은 다른 웹 언어에 비해 PHP에 우위를 점하는 진입 장벽을 낮추고 있으며, 그로 인해 성공하기 때문에 핵심 언어를 계속 향상시킬 필요가 없습니다.
Dan Ray

10

PHP는 사양이없는 언어이기 때문입니다.

문자 그대로 모든 사람이 몇 가지 기능을 추가 할 수 있었으며 처음에는 일관성에 대한 의문점이 없었습니다. 엉망입니다.


모든 사람이 기능을 추가 할 수있는 것은 아닙니다
StasM

@StasM : DEV 그룹은 누가 할 수 있습니까? 해당 그룹의 운영 방식을 찾을 수있는 링크가 있습니까?
Shamim Hafiz

@ StasM : 좋아, 나는 조금 과장했다. 실제 문제는 처음부터 또는 한 사람이 코드 응집력을 담당 한 이후의 관례가 없다는 것입니다. 지금 너무 늦었다. 말 그대로 PHP를 다른 언어로 만들지 않고 변경 될 수 있을지 의문입니다.
ts01

@Shamim Dev 그룹 운영 원칙은 합의와 확신의 두 가지입니다. 어느 것이 멋지지만, 좋은 언어 발달을 위해 충분하지 않습니다
ts01

@Shamim : php.net 및 wiki.php.net으로 시작하십시오.
StasM

4

가장 좋은 언어는 일관성을 유지하기 위해 노력하고 있습니다.

PHP 상태의 현실 일뿐입니다. StasM이 언급했듯이, 사실 이후에 그런 것들을 시도하고 바꾸는 것은 악몽 일 것입니다. 기존 코드에 너무 많은 영향을 미칩니다. 종종 PHP는 단순히 기능을 더 이상 사용하지 않고 더 일관된 새로운 기능을 생성하지만 시간이 오래 걸릴 수 있습니다.

성공적인 PHP 프로그래머는 특정 구문을 기억하거나 자동으로 구문을 알려주는 소프트웨어를 사용한다고 생각합니다.


더 이상 사용되지 않는 기능은 쉬운 것입니다. 인수 순서 변경은 더욱 어렵습니다
ts01

@ ts01은 필수 문제를 해결합니다. 단지 위치 매개 변수와 함께 기존 것을 알 수있는 방법은 없습니다 foo(a,b)지금해야 foo(b,a)사람이 foo에의 서명을 변경하기 때문이다.
Frank Shearar

@ ts01, @Frank : 함수의 이름도 바꿔야합니다 . 다른 적절한 이름 없는 "property_exists"와 같은 것들에 대해서는 특히 좋은 생각 아닙니다. 개인적으로, 배열이 실제 객체가되어서 말할 수는 $array->key_exists('whatever')있지만 meh :-)
Dean Harding

실제로, PHP 개발자가 할 수있는 일은 이것을 감싸기위한 고유 한 새로운 기능을 만드는 것입니다. 또한 isset ()은 언급 된 두 예제 모두에 대해 보편적 인 구문을 가지고 있지만 컴파일 된 스펙의 일부로 더 이상 사용되지 않습니다.
user1122069

3

불일치의 주요 원인은 내장 함수에서 PHP의 많은 부분이 실제로 C 라이브러리를 감싸는 것입니다. 초기 생각은 "C 함수 xxxx를 래핑하고 있으므로 매개 변수 순서를 동일하게 유지해야합니다"였습니다. "pure php"함수를 작성할 때이 생각은 "xxxx는 파일을 가져오고 옵션은"으로 확장됩니다. 새로운 함수는 파일 이름과 옵션을 사용하므로 yyyy는 동일한 순서로 동일한 매개 변수를 사용하는 것이 좋습니다.

여기서 큰 결점은 기본 C 라이브러리가 처음부터 매우 일관성이 없다는 것입니다.


또한 다른 함수 이름에 대해 C의 이름 지정 규칙 (예 :있는 그대로)에서 크게 벗어나면서 일부 경우에 랩핑 한 C 함수 이름 (특히 str 함수)을 유지했습니다.
Dan Ray

2

(a?) 이유는 이전 버전의 PHP와 호환되는 것이 었습니다. 많은 응용 프로그램을 손상시키는 기능 이름을 변경하는 대신 기능이 그대로 유지됩니다. 그러나 직감적으로, 새로운 언어에 대해서는 일관된 기능 명명을 고려해야합니다.

개발 시간이 낭비된다는 사실에 동의하지 않습니다. PHP를 배우면 특정 함수의 이름을 이해하는 데 시간이 더 걸릴 수 있지만 일단 숙달되면 (또는 적어도 알고 있음) 문제가되지 않습니다.

호환성> 일관성 (최소한 PHP)


1
다른 언어에서는 문서를 지속적으로 참조하지 않고 작성할 수 있습니다. PHP 항상 걱정해야합니다 ...이 함수의 철자가 "str_"입니까 아니면 "str"입니까? 이 "배열 _"인가 아니면 배열을 언급하지 않습니까? 문자열이 주어지면 "length ()"는 무엇을 하는가? 아, 아뇨, 정말로 "strlen ()"입니다 ... "바늘, 건초 더미"또는 "건초 더미, 바늘"입니까? 다른 언어로는이 모든 것을 다룰 수 없습니다.
Dan Ray

당신처럼 나는이 @ DanRay에 끊임없이 귀찮았습니다. NetBeans PHP IDE를 사용하기 시작했지만 편집기에서 필요한 정확한 정보를 얻을 수 있습니다.
deed02392
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.