Voici un équivalent de ton code en Erlang. Attention, c'est de l'objet et les objets en erlang sont des process concurrents (en somme, quand on instancie une biblio on l'a dans tout le système, ce n'est pas un objet qui va vivre seulement le temps d'une requête, c'est pour ça que le code peut paraître long pour ce qu'il fait. Ceci dit, pour le moment ton code PHP ne montre pas comment on traduirait tous les livres.
edit: la version colorée (maudit forum)
http://paste.bouh.org/f3859a4f06fc46bd9e2be95f3edbc070
Et l'ouput shell :
edit: la version colorée (maudit forum)
http://paste.bouh.org/f3859a4f06fc46bd9e2be95f3edbc070
-module(biblio).
-export([livre/2,biblio/0]).
-export([add_livre/2]).
-export([new/0]).
-export([test/0]).
-type livre() :: {livre, Titre :: string(), Texte :: string()}.
-type biblio() :: {biblio, Books :: [livre()]}.
livre(Titre,Texte) -> {livre, Titre, Texte}.
new() -> spawn(fun() -> biblio() end).
biblio() ->
biblio([]).
add_livre(Biblio,Book) ->
Biblio ! {add_book, Book, self()},
receive Response -> Response end.
get_livre(Biblio,Titre) ->
Biblio ! {get_livre, Titre, self()},
receive Response -> Response end.
%% Internal ------------------------
biblio(Books) ->
NewBooks =
receive
{get_livre, BookName, From} ->
Result = orddict:find(BookName,Books),
From ! Result,
orddict:erase(BookName,Books)
; {add_book, {livre, Titre,_}=NewBook, From} ->
NewDict = orddicttore(Titre, NewBook, Books),
From ! ok,
NewDict
; _ -> Books
end,
biblio(NewBooks).
test() ->
Bibli = new(),
add_livre(Bibli,livre("Hamlet", "One upon a time ...")),
io:format("Recup du bouquin : ~p~n",[get_livre(Bibli,"Hamlet")]),
io:format("Y a plus le bouquin : ~p~n",[get_livre(Bibli,"Hamlet")]),
ok.
Et l'ouput shell :
Recup du bouquin : {ok,{livre,"Hamlet","One upon a time ..."}}
Y a plus le bouquin : error
ok